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); }