题目:
A+B问题(大数)
题解:
遇到类似这种大数问题时,由于C++提供的基本类型能表示的数的范围不足,所以需要使用字符串来代替大数,在进行大数的运算操作时需要特别注意进位的处理。
1. 数字与字符的相互转换:
数字 ---> 字符: c = char(d + '0')
字符 ---> 数字: d = c - '0'
2. 由于要考虑进位问题,计算需要从两个字符串的末尾开始,每计算出一位的值就将其放入一个vector(也可直接使用一个字符串然后使用+运算符连接字符)
具体思路看代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
int n_case;
cin >> n_case;
vector<char> save; // 用于保存结果字符
string a, b, ta, tb, res;
bool carry; // 是否进位
int sum;
for (int i = 0; i < n_case; ++i) {
// 初始化
carry = false;
sum = 0;
cin >> ta >> tb;
// 清理
save.clear();
res.clear();
// 将length更长的字符串对象赋给a,小的赋给b
if (ta.size() < tb.size()) {
a = tb;
b = ta;
}
else {
a = ta;
b = tb;
}
int size_a = a.size(), size_b = b.size();
int tsz_a = size_a, tsz_b = size_b;
// 从两个字符串的末尾开始相加,直到某个字符串遍历完成
while ((tsz_b--) && (tsz_a--)) {
sum = a[tsz_a] - '0' + b[tsz_b] - '0';
// 进位+1
if (carry) ++sum;
// 判断是否进位
if (sum > 9)
carry = true;
else
carry = false;
// 当前位的值转换为字符放入save
save.push_back((char)(sum % 10 + '0'));
}
// 在上一个while循环结束后,更长的字符串还有剩余,将其处理掉
for (int j = size_a - size_b - 1; j >= 0; --j) {
sum = a[j] - '0';
if (carry)
++sum;
if (sum > 9)
carry = true;
else
carry = false;
save.push_back(char(sum % 10 + '0'));
}
// 若存在进位,在最后添一个1
if (carry)
save.push_back('1');
// 逆序将save中的字符连接,得到结果
for (int j = save.size() - 1; j >= 0; --j) {
res += save[j];
}
printf("Case %d:\n", i+1);
cout << ta << " + " << tb << " = " << res << endl;
// 判断,若本次循环不是最后一个case,则空出一行(题目要求)
if (i < n_case - 1)
printf("\n");
}
return 0;
}