两个大数我们可以用数组来保存,然后在数组中逐位进行相加,再判断该位相加后是否需要进位,为了方便计算,我们将数字的低位放在数组的前面,高位放在后面。
#include<stdio.h> #include<string.h> int main(){ char n1[10000]={'0'},n2[10000]={'0'}; int result[10001]={0},t1[10000]={0},t2[10000]={0}; int len,len1,len2; int i,j; printf("请输入第一个数:"); scanf("%s",&n1); printf("请输入第二个数:"); scanf("%s",&n2); printf("n1=%s\n",n1); printf("n2=%s\n",n2); len1=strlen(n1); len2=strlen(n2); printf("len1=%d len2=%d\n",len1,len2); if(len1>len2){ len=len1; }else{ len=len2; } for(i=0,j=len1-1;j>=0;i++,j--){ t1[i]=n1[j]-'0'; } for(i=0,j=len2-1;j>=0;i++,j--){ t2[i]=n2[j]-'0'; } printf("t1="); for(i=0,j=len-1;j>=0;i++,j--){ printf("%d",t1[i]); } printf("\nt2="); for(i=0,j=len-1;j>=0;i++,j--){ printf("%d",t2[i]); } printf("\n"); for(i=0;i<len;i++){ result[i]+=t1[i]+t2[i]; if(result[i]>9){ result[i+1]++; result[i]-=10; } } if(result[len]>0){ len++; } printf("result="); for(i=len-1;i>=0;i--){ printf("%d",result[i]); } printf("\n"); return 0; }
关键部分方便理解记忆:
if(len1>len2){ len=len1; }else{ len=len2; //len为两个数组中最长的字符串长度 } for(i=0,j=len1-1;j>=0;i++,j--){ //将字符转为单个数字并且倒序存放在int类型数组中 t1[i]=n1[j]-'0'; } for(i=0,j=len2-1;j>=0;i++,j--){ //将字符转为单个数字并且倒序存放在int类型数组中 t2[i]=n2[j]-'0'; } for(i=0;i<len;i++){ result[i]+=t1[i]+t2[i]; //相加计算,注意(+=)为了进位 if(result[i]>9){ result[i+1]++; //进位 result[i]-=10; } } if(result[len]>0){ //判断最大一位是否有进位 len++; } for(i=len-1;i>=0;i--){ //倒序将结果输出 printf("%d",result[i]); }