首页 > 代码库 > 分析A + B Problem II

分析A + B Problem II

题目

 

我有一个很简单的问题要问你。给定两个整数A和B,你的工作是计算A + B的和。

输入

输入的第一行包含整数T(1 < = T < = 20),这意味着测试用例的数量。然后T行遵循,每一行包含两个正整数,A和b。注意整数是非常大的,这意味着你不应该用32位整数来处理它们。您可以假设每个整数的长度不会超过1000。

输出

对于每个测试用例,您应该输出两行。第一行是“Case #:”,#表示测试用例的数量。第二行是“A + B = Sum”的方程,和表示A + B的结果,这里有一些空格为等式。在两个测试用例之间输出一个空行

2
1 2
112233445566778899 998877665544332211

Sample Output

Case 1:
1 + 2 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

解法一:
主要思路先用两个字符数组读取大整数,在将其转换数字分别储存到整型数组中进行运算;
 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 
 5 #define MAX 1010
 6 int add1[MAX], add2[MAX], res[MAX];                          
 7 char tmp1[MAX], tmp2[MAX];
 8 int main()
 9 {
10     int N, i, j, len, len1, len2, tmp, k;
11         scanf("%d",&N);
12         getchar();
13         for(j=0;j<N;j++)
14         {
15             memset(add1,0,sizeof(add1));                                  //开始没有对数组的每个成员初始化为0,使的在进行进位操作时比较麻烦
16             memset(add2,0,sizeof(add2));                                  //因为没有在每次循环开始时初始化,导致运算结果出错
17             memset(res,0,sizeof(res));
18             memset(tmp1,0,sizeof(tmp1));
19             memset(tmp2,0,sizeof(tmp2));
20             scanf("%s %s",tmp1,tmp2);
21             len1 = strlen(tmp1);
22             len2 = strlen(tmp2);
23             for(i=len1-1,k=0;i>=0;i--)
24                 add1[k++] = tmp1[i] - 0;
25
26             for(i=len2-1,k=0;i>=0;i--)
27                 add2[k++] = tmp2[i] - 0;
28             tmp = 0;
29             if(len1 >= len2)
30             {
31                 for(i=0;i<=len1;i++)
32                 {
33                     res[i] = (add1[i] + add2[i] +tmp)%10;
34                     tmp = (add1[i] + add2[i] +tmp)/10;
35                 }
36             }
37             else if(len1 < len2)
38             {
39                 for(i=0;i<=len2;i++)
40                 {
41                     res[i] = (add1[i] + add2[i] +tmp)%10;
42                     tmp = (add1[i] + add2[i] +tmp)/10;
43                 }
44             }
45             if(len1 >= len2) len = len1;
46             else len = len2;
47             printf("Case %d:\n%s + %s = ",j+1, tmp1 , tmp2);
48             if(res[len]!=0) printf("%d",res[len]);    
49             for(i=len-1;i>=0;i--)
50                     printf("%d",res[i]);
51         
52             printf("\n");
53             if(j!=N-1) printf("\n");
54         }
55     return 0;
56 }

解法二:

这个方法的没有上面那种清楚,但很有趣,这个方法利用了字符的ACIII的大小关系进行运算

 1 #include <iostream>
 2 
 3 using namespace std;
 4 #include<string.h>
 5 #include<stdio.h>
 6 void Add(char a[],char b[],char d[])
 7 {
 8     char c[1010];
 9     int lena=strlen(a),lenb=strlen(b);
10     int i,j,len;
11     len=lena>lenb?lena:lenb;
12     len++;
13     c[0]=\0;
14     for(i=1;i<=len;i++)c[i]=0;
15     for(i=1;i<=lena;i++)c[i]+=a[lena-i]-48;                 //进行相加,暂时不继续进位计算             
16     for(i=1;i<=lenb;i++)c[i]+=b[lenb-i]-48;
17     for(i=0;i<=len;i++)
18         if(c[i]>57)                                    
19     {
20             c[i]-=10;
21             c[i+1]++;
22         }
23 
24     for(i=len;i>1;i--)
25         if(c[i]==48)len--;
26         else break;
27      for(i=0;i<=len;i++)
28         d[i]=c[len-i];
29 }
30 int main()
31 {
32     int t,jishu=0;
33     char a[1010],b[1010],d[1010];
34     cin>>t;
35     for(int i=0;i<t;i++)
36     {
37         jishu++;
38 
39         cin>>a>>b;
40         Add(a,b,d);
41         cout<<"Case "<<jishu<<":"<<endl;
42         cout<<a<<" + "<<b<<" = "<<d<<endl;
43         if(i!=t-1)
44             cout<<endl;
45     }
46     return 0;
47 }

 

分析A + B Problem II