新A+B,实现大数的加法运算
题目描述:给你两个数a和b,要求他们的和

看到这道题,首先我们需要知道的是,如果用int类型来存储像10000000000000000这么大的数,肯定是存不下的。那么这个问题该如何解决呢?很简单,我们只需要把这里的数字看成字符串就可以了。当然,要实现加法的话,我们还需要做的就是用字符数组存储这样一个字符串之后,还要把字符数组转化为整型数组,并逆序。其中整型数组每个元素都只有一个数字。计算完毕之后要记得重新变回字符串。
完整代码如下(C语言代码):
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define N 1000000 5 int i,j,len_ch1,len_ch2,len_sum,result_size,temp; 6 char ch1[N],ch2[N],str_sum[N]; 7 int num1[N] = {0}; 8 int num2[N] = {0}; 9 int sum[N] = {0}; 10 int main(void) 11 { 12 while(scanf("%s %s",ch1,ch2) != EOF) 13 { 14 len_ch1 = strlen(ch1); 15 len_ch2 = strlen(ch2); 16 temp = len_ch1 > len_ch2 ? len_ch1 : len_ch2; //temp变量取两个数组长度中长的那一个 17 18 for(i = len_ch1 - 1,j = 0;i >= 0;i--) //将ch1数组转化为整型数组并逆序,下同 19 { 20 num1[j++] = ch1[i] - '0'; 21 } 22 for(i = len_ch2 - 1,j = 0;i >= 0;i--) 23 { 24 num2[j++] = ch2[i] - '0'; 25 } 26 27 for(i = 0;i <= temp;i++) 28 { 29 result_size = i + 1; 30 sum[i] += (num1[i] + num2[i]); //实现加法 31 if(sum[i] > 9) //这里要记得考虑进位的情况 32 { 33 sum[i] = sum[i] - 10; 34 sum[i+1]++; 35 } 36 } 37 38 if(sum[result_size - 1] == 0) 39 { 40 result_size -= 1; 41 } 42 43 for(i = result_size - 1,j = 0;i >= 0;i--) 44 { 45 str_sum[j++] = sum[i] + '0'; 46 } 47 48 printf("%s + %s = %s",ch1,ch2,str_sum); 49 memset(ch1,'\0',N);memset(ch2,'\0',N); 50 memset(num1,0,N);memset(num2,0,N); 51 memset(str_sum,'\0',N);memset(sum,0,N); 52 printf("\n"); 53 } 54 return 0; 55 }
至于为什么是逆序,因为在列竖式进行加法运算的时候,两个数的每一位都是要对齐的,如个位与个位对齐,十位与十位对齐,如果不逆序的话,若碰到位数不相同的数相加,其位数是不对齐的。而逆序则完美地解决了这个问题。当然在进行一次操作之后,要记得对所有数组清零。确保结果下次不会累加。
运行效果如下:


浙公网安备 33010602011771号