大整数加法
求两个不超过 200 位的非负整数的和。
输入格式
有两行,每行是一个不超过 200 位的非负整数,可能有多余的前导 0。
输出格式
一行,即相加后的结果。结果里不能有多余的前导 0,即如果结果是 342,那么就不能输出为 0342。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
22222222222222222222 33333333333333333333
样例输出
55555555555555555555
坑点:
- 模拟各位相加及进位的逻辑
- 前导 0 ,最后几个测试数据有好几位前导 0 ,这些 0 都不能输出,最后一组测试数据则全都是 0 。。。 只能输出最后一个 0
坑死了。。。
#include<stdio.h> int a[201]; int b[201]; int c[300]; int main(){ int i = 0; char cc; while( (cc = getchar() )!= ' ' ){ a[i] = cc - 48; i++; } int j = 0; while( (cc = getchar() )!= ' ' ){ b[j] = cc - 48; j++; } // 上方是两个大整数的输入过程 int x = 0; i--; j--; int jw = 0; // 模拟加法运算及进位逻辑 while(i >= 0 && j >= 0){ int u = a[i] + b[j] + jw; jw = 0; if( u >= 10){ c[x] = u % 10; jw = u /10; x++; i--; j--; }else{ c[x] = u; jw = 0; j--; i--; x++; } } // 两个大整数有一个大整数的所有位已经参与运算,判断是哪个大整数还有数位剩余 if(i == -1 && j != -1){ while(j != -1){ int pp = jw + b[j]; jw = 0; if(pp >= 10){ c[x] = pp % 10; jw = pp /10; x++; }else{ c[x] = pp; x++; } j--; } } if(i != -1 && j == -1){ while(i != -1){ int pp = jw + a[i]; jw = 0; if(pp >= 10){ c[x] = pp % 10; jw = pp /10; x++; }else{ c[x] = pp; x++; } i--; } } if(i == -1 && j == -1){ if(jw != 0){ c[x] = jw; x++; } } x--; int flag = 1; // 解释见上方的 坑点 for(int r = x;r > 0;r--){ if(c[r] == 0 && flag == 1) continue; else { printf("%d",c[r]); flag = 0; } } printf("%d",c[0]); return 0; }