2981:大整数加法,考点:数组
原题:http://bailian.openjudge.cn/practice/2981/
描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
样例输入
22222222222222222222 33333333333333333333
样例输出
55555555555555555555
解法
思路:模拟小学竖式的计算,从个位开始一个一个的加,中间注意进位。
坑:前导0,如果答案是0不能被去掉,测试样例里包括0+0(找了很久的bug才发现)。
#include <iostream> #include <cstring> using namespace std; int factora[200]; int factorb[200]; int sum[205]; int cnt1, cnt2; int add() { int maxc = cnt1 < cnt2 ? cnt2 : cnt1; for (int i = 0; i < maxc; i++) { int temp = sum[i]; sum[i] = (factora[i] + factorb[i] + sum[i]) % 10; sum[i + 1] += (factora[i] + factorb[i] + temp) / 10; } if (sum[maxc] != 0) { if (sum[maxc] > 9) sum[maxc + 1] = sum[maxc] / 10; sum[maxc] = sum[maxc] % 10; } for (int j = maxc + 2; j >= 0; j--) { if (sum[j] != 0) return j; } return 0; } int main() { memset(sum, 0, sizeof(sum)); cnt1 = 0; cnt2 = 0; char inputa[200]; char inputb[200]; cin >> inputa; cin >> inputb; cnt1 = strlen(inputa); cnt2 = strlen(inputb); for (int i = 0; i < cnt1; i++) factora[cnt1 - 1 - i] = inputa[i] - '0'; for (int i = 0; i < cnt2; i++) factorb[cnt2 - 1 - i] = inputb[i] - '0'; int result = add(); for (int j = result; j >= 0; j--) cout << sum[j]; return 0; }