点击打开链接
2032: 高精度加法
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 93 Solved: 41
[Submit][Status][Web Board]
Description
问题描述
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
最后将C输出即可。
Input
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
Output
输出一行,表示a + b的值。
Sample Input
201001222010012212345678902010012220100122
Sample Output
20100122203011233454668012
HINT
Source
解题思路:
1.先将字符数组倒转,使得m[0],n[0]存储个位数,m[1],n[0]存储十位数,以此类推。
2.模拟加法过程。
这里有个细节刚开始一直没注意,在倒转数组时应该-‘0’,使得字符转变为整数,再讲所得的数存入sum数组中时,又该加回‘0’,使得其变为字符。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
int la,lb,i,c=0;
char a[101],b[101],m[101]={0},n[101]={0},sum[101]={0};
scanf("%s",&a);
scanf("%s",&b);
la=strlen(a);
lb=strlen(b);
for(i=0;i<la;i++)m[i]=a[la-i-1]-'0';
for(i=0;i<lb;i++)n[i]=b[lb-i-1]-'0';
for(i=0;i<la||i<lb;i++){
sum[i]=(m[i]+n[i]+c)%10+'0';
c=(m[i]+n[i]+c)/10;
}
if(c!=0)sum[i]=(m[i]+n[i]+c)%10+'0';
for(i=strlen(sum);sum[i]==0;i--);
for(;i>=0;i--)printf("%c",sum[i]);
printf("\n");
return 0;
}