-大整数加法
题目描述
求两个不超过200位的非负整数的和。
输入有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。输出一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
代码如下:
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; char a[201]; char b[201]; char c[500]; int cnt=0; int main() { int na,nb; int k; // 判断进位数 int len; int temp; int countt; int p=-1; gets(a); gets(b); na=strlen(a); nb=strlen(b); len=max(na,nb); for(int i = na-1 ; i >= 0 ; i--){ c[cnt++]=(int)a[i]; //反向储存 } strcpy(a,c); memset(c,0,sizeof(c)); cnt=0; for(int i = nb-1 ; i >= 0 ; i--){ c[cnt++]=(int)b[i]; //反向储存 } strcpy(b,c); memset(c,0,sizeof(c)); cnt=0; for(int i = 0 ; i < len ; i++){ countt=cnt; // 这是几种情况,如果a[i] / b[i] / c[i] 其中一个为 0 为0那个就不能 -48 了 // 不知道为啥,难道是因为 手动输入的 要-48 才 == 那个数,赋值的不用-48就是那个数了 if(c[cnt]!=0&&b[i]!=0&&a[i]!=0) c[cnt]=(a[i]-48)+(b[i]-48)+c[cnt]; else if(c[cnt]==0&&a[i]!=0&&b[i]!=0) c[cnt]=(a[i]-48)+(b[i]-48); else if(c[cnt]==0&&a[i]==0&&b[i]!=0) c[cnt]=(b[i]-48); else if(c[cnt]==0&&a[i]!=0&&b[i]==0) c[cnt]=(a[i]-48); else if(c[cnt]!=0&&a[i]==0&&b[i]!=0) c[cnt]=(b[i]-48)+c[cnt]; else if(c[cnt]!=0&&a[i]!=0&&b[i]==0) c[cnt]=(a[i]-48)+c[cnt]; temp=c[cnt]; c[cnt]=temp%10; k=temp/10; cnt++; while(k) { // 记录进位 countt++; c[countt]+=k; k=k/10; } } for(int i = len ; i >= 0 ; i--) { // 忽略前导0 if(c[i]!=0) { p=i; break; } } if(p==-1) { //判断输入的 数组 a 和 数组 b 是否全部都为 0 p=0; // 是就让它输出一个0 , 当时写的时候 p = len-1 , 也过了,不知道为啥 } for(int i = p ; i >= 0 ; i--) { printf("%d",c[i]); //反向输出为结果 } return 0; }