题目
任意两个十进制正整数(字符串表示),请打印两个正整数的和。
解答
我们在小学加减法采用的是竖式加减法,这个题也是如此。
输入 “112” + “88”,各位相加,满 10 进 1,依次计算个位数、十位数、百位数…
我们来看下面的 C++ 代码,竖式加法注意 进位的处理
#include <iostream>
#include <string>
using namespace std;
int char2int(char c) {
return c - '0';
}
char int2char(int i) {
return i + '0';
}
string big_numbers_sum(const std::string& num1, const std::string& num2) {
const int BASE = 10;
size_t len1 = num1.length();
size_t len2 = num2.length();
size_t len_max = len1 > len2 ? len1 + 1 : len2 + 1;
char* dst = new char[len_max + 1];
dst[len_max] = '\0';
int i = len1 - 1;
int j = len2 - 1;
int k = len_max - 1;
int up = 0;
while (i >= 0 && j >= 0) {
dst[k] = int2char((char2int(num1[i]) + char2int(num2[j]) + up) % BASE);
up = (char2int(num1[i]) + char2int(num2[j]) + up) / BASE;
i--;
j--;
k--;
}
while (i >= 0) {
dst[k] = int2char((char2int(num1[i]) + up) % BASE);
up = (char2int(num1[i]) + up) / BASE;
i--;
k--;
}
while (j >= 0) {
dst[k] = int2char((char2int(num2[j]) + up) % BASE);
up = (char2int(num2[j]) + up) / BASE;
j--;
k--;
}
string res(dst, len_max); // res 长度 = len_max
if (up > 0) {
res[0] = int2char(up); // dst[0] 可能的最高位
} else {
res.erase(0, 1);
}
delete[] dst;
dst = NULL;
return res;
}
int main() {
string num1, num2;
while (std::cin >> num1 >> num2) {
cout << big_numbers_sum(num1, num2) << endl;
}
return 0;
}
运行结果
>
1 9
10
111111111111111 88888888888889
200000000000000
123 123123123123123123123123
123123123123123123123246