#航电OJ1002
问题描述
对您来说,我有一个非常简单的问题。给定两个整数A和B,您的工作是计算A + B的总和。
输入项
输入的第一行包含一个整数T(1 <= T <= 20),它表示测试用例的数量。然后是T行,每行由两个正整数A和B组成。请注意,这些整数非常大,这意味着您不应使用32位整数对其进行处理。您可以假设每个整数的长度不超过1000。
输出量
对于每个测试用例,您应该输出两行。第一行是“ Case#:”,#表示测试用例的编号。第二行是等式“ A + B = Sum”,Sum表示A + B的结果。请注意,该等式中有一些空格。在两个测试用例之间输出空白行。
样本输入
2
1 2
112233445566778899 998877665544332211
样本输出
情况1:
1 + 2 = 3
情况2:
112233445566778899 + 998877665544332211 = 1111111111111111110
注意:
- 这个题不能用整数简单相加来做,题目描述中已经进行了提示(请注意,这些整数非常大,这意味着您不应使用32位整数对其进行处理。您可以假设每个整数的长度不超过1000。),用整数简单相加会导致数据溢出,应选用字符串解决问题。
- 下列解题过程中用到的sstream中的stringstream定义的ss要进行重复使用,每次使用前必须用clear函数进行清除。
- 注意格式问题,最后一行不能多输出一个换行。
- 字符串解决的思路即为自己在草稿纸上对两个整数进行求和时的思路,相同数位的数进行相加,相加之和>=10时则向前进1。
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
int T;
cin>>T;
for(int count=1;count<=T;count++)
{
string a,b,sum="",strsin="",strdec="";
int media=0,sin=0,dec=0;
cin>>a>>b;
int i=a.size()-1,j=b.size()-1;
while(i>=0||j>=0)
{
stringstream ss;
if(i>=0) media+=a[i--]-'0';
if(j>=0) media+=b[j--]-'0';
sin=media%10;
dec=media/10;
media=dec;
ss.clear();
ss<<sin;
ss>>strsin;
ss.clear();
ss<<dec;
ss>>strdec;
sum=strsin+sum;
}
if(dec>0)
sum=strdec+sum;
cout<<"Case "<<count<<':'<<'\n'<<a<<" + "<<b<<" = "<<sum<<'\n';
if(count<T) cout<<'\n';//注意最后一行不能多输出一个换行
}
cout<<'\n';
}