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
代码
class BigInt
{
public:
BigInt()
{
a=new int[101];
k=0;
}
~BigInt()
{
delete[] a;
}
void tranf();//将字符转化为数组
friend istream& operator>>(istream& is,BigInt& n);
friend ostream& operator<<(ostream& os,BigInt& n);
friend BigInt operator+(BigInt& a,BigInt& b);
BigInt& operator=(const BigInt&);
private:
int *a;
string arr;
int k;
};
BigInt& BigInt::operator=(const BigInt& b)//深拷贝
{
if(this==&b) return *this;
arr=b.arr;
k=b.k;
delete[] a;
a=new int[k];
for(int i=0;i<k;i++)
{
a[i]=b.a[i];
}
return *this;
}
void BigInt::tranf()
{
int n=arr.length();
k=n;
for(int i=0;i<n;i++)
{
a[i]=arr[n-i-1]-'0';//将字符转化数字,将字符倒序输入到数组中
}
for(int i=n;i<101;i++)//其余位数都为0,方便后来的加法
{
a[i]=0;
}
}
istream& operator>>(istream& is,BigInt& b)
{
is>>b.arr;
return is;
}
ostream& operator<<(ostream& os,BigInt& b)
{
os<<b.arr;
return os;
}
BigInt operator+(BigInt& x1,BigInt& x2)
{
BigInt y;
int i=0,j=0,l=0,t=0;
x1.tranf();
x2.tranf();
while(i<x1.k||j<x2.k)//保证每一位都进行了加法
{
y.a[t]=x1.a[i++]+x2.a[j++]+l;//l是低位向高位的进位
l=y.a[t]/10;
y.a[t]%=10;
t++;
}
while(l>0)//不要忘记较小的数加完后剩下的进位
{
y.a[t]+=l;
l=y.a[t]/10;
y.a[t]%=10;
t++;
}
y.k=t;//此时的t是最高位前面的那一位
for(i=y.k-1;i>=0;i--)
{
y.arr+=y.a[i]+'0';//将数字转化为字符
}
return y;
}