分析A + B Problem II
2018-06-17 22:12:38来源:未知 阅读 ()
题目
我有一个很简单的问题要问你。给定两个整数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 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:05:登月计划
下一篇:T7315 yyy矩阵折叠(长)
- P1358 扑克牌 2020-05-06
- 博弈--巴什博弈 2020-04-24
- Z 字形变换 2020-04-14
- [题记-并查集] 合根植物 - 蓝桥杯 2020-04-07
- 无法正确通过算法题目都是哪些原因造成的? 2020-04-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash