题目
我有一个很简单的问题要问你。给定两个整数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:
%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("
");
53 if(j!=N-1) printf("
");
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]='