1018: A+B again
题目描述
谷学长有一个非常简单的问题给你,给你两个整数A和B,你的任务是计算A+B。
输入
输入的第一行包含一个整数T(T<=20)表示测试实例的个数,然后2*T行,分别表示A和B两个正整数。注意整数非常大,那意味着你不能用32位整数来处理。你可以确定的是整数的长度不超过1000。
输出
对于每一个样例,你应该输出两行,第一行是"Case #:",#表示第几个样例,第二行是一个等式"A+B=Sum",Sum表示A+B的结果。注意等式中有空格。
样例输入
2 1 2 112233445566778899 998877665544332211
样例输出
Case 1: 1 + 2 = 3 Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110
提示
大数加法问题,在大数运算里面相对还算简单,不过对初学者博主来说,思路清晰,不过写代码能力明显就有点跟不上了。
下面我们来分析下吧:
前面的Case什么的只要把相应已知数据输出即可,下面我们重点来分析下加法的结果
首先我们看他的输入,是连续输入,即这个大数字各个位之间是没有空格的,这就意味着用整型的数组难以实现数据的输入问题。因此我们考虑用字符型数组解决输入问题。
这里方便起见;我们输入字符数组a为“98”,b为“9” 来分析下思路。
原理就是模拟小学加法,要做加法,首先每位数字应对齐,才可对应相加。因此,我们考虑定义字符数组 char c[1001]来转移并对齐a,b中的元素;
cin>>a; "98"
代码如下:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 char a[1001],b[1001]; 6 7 void Add()//字符加法 8 { 9 10 char c[1001]; 11 memset(c,‘0‘,1001); 12 for(int i=0;i<strlen(a);i++)//对齐 13 { 14 c[i]=a[strlen(a)-1-i]; 15 } 16 17 18 memset(a,‘0‘,1001); 19 for(int i=0;i<strlen(b);i++) 20 { 21 a[i]=b[strlen(b)-1-i]; 22 } 23 24 for(int i=0;i<1000;i++) 25 { 26 a[i]+=c[i]-‘0‘; 27 if(a[i]>‘9‘) 28 { 29 a[i]-=10; 30 a[i+1]++; 31 } 32 } 33 34 } 35 36 37 int main() 38 { 39 int T,n=0; 40 cin>>T; 41 while(T--) 42 { 43 n++; 44 memset(a,‘0‘,1001); 45 memset(b,‘0‘,1001); 46 47 cin>>a>>b; 48 49 cout<<"Case "<<n<<":"<<endl; 50 cout<<a<<" + "<<b<<" = "; 51 52 53 Add(); 54 55 int k; 56 for(k=1000;k>=0;k--)//排前导0 57 { 58 if(a[k]!=‘0‘) 59 {break;} 60 } 61 for(int i=k;i>=0;i--) 62 { 63 cout<<a[i]; 64 } 65 cout<<endl; 66 } 67 return 0; 68 }
时间: 2024-10-25 19:15:02