首页 > 代码库 > 分析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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。