题目坑不多,就是大数的求和,基本就是BigDecimal的翻版,但格式输出很坑,前面两个\n
,最后一个\n
,一直pe很难受。
解题思路:
把两个数字按字符的形式按位加起来,注意下进位和高低位就行了,和链表的加法实现基本一致的思路。
#include <string>
#include <sstream>
#include "iostream"
using namespace std;
// 反转字符串,保证低位相加,非必需
string reverse(string a) {
int len = a.length();
for (int i = 0; i < a.length() / 2; ++i) {
char low = a[i];
a[i] = a[len - 1 - i];
a[len - 1 - i] = low;
}
return a;
}
// 求和 注意'0'和0之间的编码差别
char calChar(char a, char b, int c) {
return a + b + c - 2 * '0';
}
char calChar(char a, int b) {
return a + b - '0';
}
string add(string a, string b) {
int carry = 0;
int bit = 0;
string result = "";
a = reverse(a);
b = reverse(b);
// 分两种情况讨论 ,a比b长,就以b为基准相加,剩余的位数直接补上去。b比a长,则相反
if (a.length() >= b.length()) {
for (int i = 0; i < b.length(); ++i) {
bit = calChar(a[i], b[i], carry) % 10;
carry = calChar(a[i], b[i], carry) / 10;
result += bit + '0';
}
for (int i = b.length(); i < a.length(); ++i) {
bit = calChar(a[i], carry) % 10;
carry = calChar(a[i], carry) / 10;
result += bit + '0';
}
} else {
for (int i = 0; i < a.length(); ++i) {
bit = calChar(a[i], b[i], carry) % 10;
carry = calChar(a[i], b[i], carry) / 10;
result += bit + '0';
}
for (int i = a.length(); i < b.length(); ++i) {
bit = calChar(b[i], carry) % 10;
carry = calChar(b[i], carry) / 10;
result += bit + '0';
}
}
if (carry > 0) result += carry + '0';
return reverse(result);
}
int main() {
int times;
string a, b, result;
cin >> times;
for (int i = 1; i <= times; i++) {
cin >> a >> b;
result += "Case " + to_string(i) + ":\n"
+ a + " + " + b + " = " + add(a, b);
if (i < times) result += "\n\n";
else result += "\n";
}
cout << result;
return 0;
}