终于来到我所期盼的高精度整数相加的题目了。这个题很经典,也算是一个很好的算法入门题吧。
如果是java的话,系统类库已经内置了BigInteger类,直接调用就可以很轻易地解决了。但是学习c的编写也是非常有意义的。
解题思路
1、首先用两个数组s1,s2临时存放输入的数据
2、输入以后将两个数组s1、s2以si[i]-‘0‘的方式把输入的字符串型数字转化为int型的数字。
注意转换的过程中,要倒过来存,以便相加的时候低位的对齐,从低位开始相加。
3、相加的过程:同位相加,相加的结果存放在num1[i]里。如果结果>10,num[i+1]要进位(+1),并且num1[i]存放结果-10(只存放个位)
4、输出时:相加的过程中变量i一直向后移,到了最后会停在max(len(s1),len(s2))+1的位置。如果前面的加法恰好在最高位也进1,此时num1[i]就不为零。此时就要把这个多出来的高位也输出。反则不需要输出。
其他详解看代码注释。
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char s1[1000],s2[1000]; 6 int num1[1000],num2[1000],len1,len2,i,j; 7 memset(num1,0,sizeof(num1)); 8 memset(num2,0,sizeof(num2)); 9 while(scanf("%s%s",s1,s2)!=EOF) 10 { 11 len1=strlen(s1); 12 len2=strlen(s2); 13 for(i=len1-1,j=0; i>=0; --i) //从后往前处理大数字符串,把字符串变成数字组 14 { 15 16 num1[j]=s1[i]-‘0‘; 17 j++; 18 19 } 20 for(i=len2-1,j=0; i>=0; --i) 21 { 22 num2[j]=s2[i]-‘0‘; 23 j++; 24 25 } 26 //相加的处理,把num2的数加到i1中。进位加1,原超数-10 27 28 for(i=0; i<(len2>len1?len2:len1); i++) 29 { 30 num1[i]+=num2[i]; 31 if(num1[i]>9) 32 { 33 num1[i+1]+=1; 34 num1[i]-=10; 35 } 36 } 37 if(num1[i])//如果最后一位不为0,把溢出来的那一位也输出。输出倒着输 38 for(j=i; j>=0; j--) 39 printf("%d",num1[j]); 40 else for(j=i-1; j>=0; j--)//如果最后一位为0,最高位不需要输出。 41 printf("%d",num1[j]); 42 memset(num1,0,sizeof(num1)); 43 memset(num2,0,sizeof(num2)); 44 printf("\n"); 45 } 46 return 0; 47 }