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 data;
void set(string str) {
data = str;
}
friend istream &operator>>(istream &in, BigInt &bi);
friend ostream &operator<<(ostream &out, BigInt &bi);
friend BigInt operator+(BigInt &int1, BigInt &int2);
};
istream &operator>>(istream &in, BigInt &bi) {
in >> bi.data;
return in;
}
ostream &operator<<(ostream &out, BigInt &bi) {
out << bi.data ;
return out;
}
void exchange(string &n1, string &n2) { //我让n1是比较长的那个,如果不满足就交换他们
string t;
if (n1.length() < n2.length()) {
t = n1;
n1 = n2;
n2 = t;
}
}
BigInt operator+(BigInt &int1, BigInt &int2) {
BigInt res;
exchange(int1.data, int2.data);
int len1 = int1.data.length();
int len2 = int2.data.length();
int flag = 0;
while (len1 > 0 && len2 > 0) {
if (int1.data[len1 - 1] - '0' + int2.data[len2 - 1] - '0' + flag >= 10) {
string t = "";
t += ((int1.data[len1 - 1] - '0' + int2.data[len2 - 1] - '0' + flag + '0') - 10);
res.data.insert(0, t);
flag = 1;
} else {
string t = "";
t += ((int1.data[len1 - 1] - '0' + int2.data[len2 - 1] - '0' + flag + '0') );
res.data.insert(0, t);
flag = 0;
}
len1--;
len2--;
}
while (len1 > 0) {
if (int1.data[len1 - 1] - '0' + flag >= 10) {
string t = "";
t += ((int1.data[len1 - 1] - '0' + flag + '0') - 10);
res.data.insert(0, t);
flag = 1;
} else {
string t = "";
t += ((int1.data[len1 - 1] - '0' + flag + '0') );
res.data.insert(0, t);
flag = 0;
}
len1--;
}
if (flag == 1)
res.data.insert(0, "1");
return res;
}