题目描述ios
谷学长有一个很是简单的问题给你,给你两个整数A和B,你的任务是计算A+B。数组
输入测试
输入的第一行包含一个整数T(T<=20)表示测试实例的个数,而后2*T行,分别表示A和B两个正整数。注意整数很是大,那意味着你不能用32位整数来处理。你能够肯定的是整数的长度不超过1000。spa
输出code
对于每个样例,你应该输出两行,第一行是"Case #:",#表示第几个样例,第二行是一个等式"A+B=Sum",Sum表示A+B的结果。注意等式中有空格。blog
样例输入ci
2 string
1 2io
112233445566778899 998877665544332211class
样例输出
Case 1: 1 + 2 = 3
Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110
提示
大数加法问题,在大数运算里面相对还算简单,不过对初学者博主来讲,思路清晰,不过写代码能力明显就有点跟不上了。
下面咱们来分析下吧:
前面的Case什么的只要把相应已知数据输出便可,下面咱们重点来分析下加法的结果
首先咱们看他的输入,是连续输入,即这个大数字各个位之间是没有空格的,这就意味着用整型的数组难以实现数据的输入问题。所以咱们考虑用字符型数组解决输入问题。
这里方便起见;咱们输入字符数组a为“98”,b为“9” 来分析下思路。
原理就是模拟小学加法,要作加法,首先每位数字应对齐,才可对应相加。所以,咱们考虑定义字符数组 char c[1001]来转移并对齐a,b中的元素;
cin>>a; "98"
代码以下:
#include<iostream> #include<cstring> using namespace std; char a[1001],b[1001]; void Add()//字符加法 { char c[1001]; memset(c,'0',1001); for(int i=0;i<strlen(a);i++)//对齐 { c[i]=a[strlen(a)-1-i]; } memset(a,'0',1001); for(int i=0;i<strlen(b);i++) { a[i]=b[strlen(b)-1-i]; } for(int i=0;i<1000;i++) { a[i]+=c[i]-'0'; if(a[i]>'9') { a[i]-=10; a[i+1]++; } } } int main() { int T,n=0; cin>>T; while(T--) { n++; memset(a,'0',1001); memset(b,'0',1001); cin>>a>>b; cout<<"Case "<<n<<":"<<endl; cout<<a<<" + "<<b<<" = "; Add(); int k; for(k=1000;k>=0;k--)//排前导0 { if(a[k]!='0') {break;} } for(int i=k;i>=0;i--) { cout<<a[i]; } cout<<endl; } return 0; }