【题目描述】
求两个不超过200位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
22222222222222222222 33333333333333333333
【输出样例】
55555555555555555555
【注意】
- 思路看似简单,但是很多小细节需要注意
- 注意相加的实现,进位和该位的值,与原先的值有关的。
- 还可以用另一种方法,统一相加,加了之后再统一进位。
-
#include<iostream> #include<string> #include<string.h> using namespace std; void initial(int a[]) { string s; cin >> s; a[0] = s.length(); for (int i = 1; i <= a[0]; i++) { a[i] = s[a[0] - i] - '0'; } } void add(int a[], int b[], int c[]) { c[0] = (a[0] >= b[0]) ? a[0] : b[0]; for (int i = 1; i <= c[0]; i++) { /*c[i]+=(a[i]+b[i])%10; c[i+1]=(a[i]+b[i])/10;*/ //这样是错的 //首先,c[i]这一位的值应该是(c[i]+a[i]+b[i])%10,也要算上这一位本身的数的 //其次,进位实际也要与前一位的c[i]相关,所以也要在括号内加上c[i] //这种方法容易写错,可以用另一种方法替代 //每一位相加,加完了之后,再统一进位。 c[i + 1] = (c[i] + a[i] + b[i]) / 10; c[i] = (c[i]+a[i] + b[i]) % 10; } if (c[c[0] + 1] != 0) { c[0]++; } } int main() { int a[205], b[205], c[205]; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); initial(a); initial(b); add(a, b, c); for (int i = c[0]; i > 1; i--) { if (c[i] != 0) break; c[0]--; } for (int i = c[0]; i >= 1; i--) { cout << c[i]; } cout << endl; return 0; }