一本通1168 高精度加法

【题目描述】

求两个不超过200位的非负整数的和。

【输入】

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】

22222222222222222222
33333333333333333333

【输出样例】

55555555555555555555


代码:

#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> using namespace std; int main() { char a1[210],b1[210]; int a[210],b[210],c[210],lena,lenb,lenc,i,x; memset(a,0,sizeof(a));//数组清零,相当于a[210]={0} memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); gets(a1);读入两个数用字符的形式,因为200位数已经远远超过了long long gets(b1); lena=strlen(a1);//字符串长度用变量表示 lenb=strlen(b1); for(i=0;i<=lena-1;i++) { a[lena-i]=a1[i]-48;//数字的阿斯克码值减去48就是数字本身的值,所以此处是字符变成数字,每一个数字用一维数组来存放。而倒序存放也是为了方便进位,乘法同理 } for(i=0;i<=lenb-1;i++) { b[lenb-i]=b1[i]-48; } lenc=1; x=0;//x表示向上一位进的数,一开始初始化为0 while(lenc<=lena||lenc<=lenb)//两个正整数做加法,结果肯定不会小于任何一个加数 { c[lenc]=a[lenc]+b[lenc]+x;位数一一对应别忘了加上x x=c[lenc]/10;//除以10看看是否进位 c[lenc]%=10;//留下小于10的数 lenc++;//计算下一位 } c[lenc]=x;//最后一位只有x while(c[lenc]==0)如果后面有0.则删掉 lenc--; for(int i=lenc;i>=1;i--) { cout<<c[i];//因为开始倒序输入,所以输出时反过来,就又是正序了 } return 0; }
原文地址:https://www.cnblogs.com/57xmz/p/12370695.html