6-1 大整数求和(运算符重载) (15 分)
BigInt类表示不超过100位的无符号大整数。试重载>>,<<和+,以支持无符号大整数的输入、输出与求和(假设结果仍是一个不超过100位的无符号大整数)。
重载面向BigInt类对象的运算符:
>>
<<
+
裁判测试程序样例:
#include <iostream>#include <string>using namespace std;/* 请在这里填写答案 */int main(){
BigInt a, b, c; cin>>a>>b;
c=a+b; cout<<a<<"+"<<b<<"="<<c<<endl; return 0;
}
输入样例:
123456789
987654321
输出样例:
123456789+987654321=1111111110
作者
何振峰
单位
福州大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
class BigInt
{
public:
string str;
BigInt() {}
BigInt(string s)
{
str=s;
}
friend ostream&operator<<(ostream &os, BigInt &bigint)
{
os<<bigint.str;
return os;
}
friend istream&operator>>(istream &is,BigInt &bigint)
{
is>>bigint.str;
return is;
}
friend BigInt operator+( BigInt &bigint1, BigInt &bigint2);
};
BigInt operator+( BigInt &bigint1, BigInt &bigint2)
{
string a=bigint1.str;
string b=bigint2.str;
string temp;
if(a.size()>b.size())
{
temp=a;
a=b;
b=temp;
}
char *sum=new char[b.size()+2];
int carry=0;
int count=0;
int m,n,k;
int al,bl;
for (al=a.size()-1,bl=b.size()-1; al>=0; al--,bl--)
{
m=a[al]-'0';
n=b[bl]-'0';
k=m+n+carry;
if(k > 9)
{
carry=1;
k-=10;
sum[count]=k+'0';
}
else
{
sum[count]=k+'0';
carry=0;
}
count++;
}
if(a.size()==b.size() && carry==1) sum[count]='1';
if(a.size()==b.size() && carry==0) count--;
int sizeDif=b.size()-a.size();
int i=sizeDif-1;
for(bl!=0; i>=0; i--)
{
k=b[i]-'0'+carry;
if(k>9)
{
carry=1;
k-=10;
sum[count]=k+'0';
}
else
{
sum[count]=k+'0';
carry=0;
}
count++;
if(i==0 && carry==1) sum[count]='1';
if(i==0 && carry==0) count--;
}
sum[count+1]='\0';
int j;
char t;
int x=count;
for(j=0; j<=count/2; j++)
{
t=sum[j];
sum[j]=sum[x];
sum[x]=t;
x--;
}
string st(sum);
return BigInt(st);
}