(以“分类:贪心 ==摘要== {{信息题|高精度练习之加法|http://www.codevs.cn/problem/3116/|1|100|输出格式|60|time=2014-10-11 21:26:36}} ==题意== 500...”为内容创建页面) |
小 (修改分类) |
||
| 第1行: | 第1行: | ||
| − | [[分类: | + | [[分类:高精度]] |
==摘要== | ==摘要== | ||
{{信息题|高精度练习之加法|http://www.codevs.cn/problem/3116/|1|100|输出格式|60|time=2014-10-11 21:26:36}} | {{信息题|高精度练习之加法|http://www.codevs.cn/problem/3116/|1|100|输出格式|60|time=2014-10-11 21:26:36}} | ||
| 题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 失误原因(初次提交分数) |
|---|---|---|---|---|---|
| 高精度练习之加法 | ★☆☆☆☆ | 答案正确 | 100 | 2014-10-11 21:26:36 | 输出格式(60) |
500位以内的加法。
一位一位加,加完进位,类似于小学列竖式的方法。优化一些的常常使用万进制加法。
可以建立对象,通过重载运算符来使得程序更美观。
返回值类型 operator 符号 (参数a,参数b){...};
//栗子:
largeInt operator +(largeInt lhs,largeInt rhs){...};
然后可以于对象内部建立friend函数,以便访问私有函数。在对象内部建议用friend写法取代另一种operator的写法:
class T
{
T operator +(T rhs){...} //不推荐的写法
friend T operator +(T lhs,T rhs){...} //推荐的写法
}
原因是如果涉及隐式类型转换,下面那一种可以正确处理而上面只能处理右值。
其它不多说了。
| 3116.cpp代码已折叠
展开折叠内容
|
|---|
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
using namespace std;
class largeInt
{
public:
const int size() const
{
return u.size();
}
largeInt()
{
u.clear();
u.push_back(0);
}
largeInt(const int &number)
{
u.clear();
u.push_back(number);
carry();
}
void scan()
{
u.clear();
string original;
cin>>original;
for(int i=original.size()-1,j=0,p=1;i>=0;--i)
{
j+=(original[i]-'0')*p;
p*=10;
if((!i) || p==10000)
{
u.push_back(j);
j=0;
p=1;
}
}
}
void print() const
{
cout<<setw(0)<<setfill('0')<<u[size()-1];
for(int i=size()-2;i>=0;--i)
cout<<setw(4)<<setfill('0')<<u[i];
}
friend const largeInt operator +(const largeInt &a,const largeInt &b)
{
largeInt r;
r.u.resize(max(a.size(),b.size()));
for(int i=0;i<r.size();++i)
{
if(i<a.size())
r.u[i]+=a.u[i];
if(i<b.size())
r.u[i]+=b.u[i];
}
r.carry();
return r;
}
private:
vector<int> u;
void carry()
{
for(int i=0;i<size();++i)
{
if(u[i]>=10000)
{
if(i==size()-1)
u.push_back(u[i]/10000);
else
u[i+1]+=u[i]/10000;
u[i]%=10000;
}
}
}
};
int main()
{
largeInt a,b;
a.scan();
b.scan();
(a+b).print();
}
|