新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 }

至于为什么是逆序,因为在列竖式进行加法运算的时候,两个数的每一位都是要对齐的,如个位与个位对齐,十位与十位对齐,如果不逆序的话,若碰到位数不相同的数相加,其位数是不对齐的。而逆序则完美地解决了这个问题。当然在进行一次操作之后,要记得对所有数组清零。确保结果下次不会累加。

运行效果如下:

posted @ 2021-01-23 23:44  EvanTheBoy  阅读(122)  评论(0)    收藏  举报