杭电HDU 1002 A+B problem (完美简洁)
涉及到的知识
- 反向迭代器 rbegin() rend()
- assign() 函数
思路
例如输入 :1234 和 1
取反 :4321 和 1
加零 :4321 和 1000(把位数少的数字后面(取反后的)加0,1234有四位数,1只有一位数,所以在1后面加3个0)
相加 :5321
取反并输出:1235
让我们开始代码吧
#include <iostream>
#include<cstring>
using namespace std;
int main()
{
string A,B;
int m;cin>>m;
for(int n=0;n<m;n++)
{
cin>>A>>B;
cout<<"Case "<<n+1<<':'<<endl;
cout<<A<<" + "<<B<<" = ";
size_t Al=A.length();
size_t Bl=B.length();
A.assign(A.rbegin(),A.rend());
B.assign(B.rbegin(),B.rend());
if(Al<Bl)///向位数少的后面添加0
for(size_t i=0;i<Bl-Al;i++)
A+='0';
else if(Al>Bl)
for(size_t i=0;i<Al-Bl;i++)
B+='0';
string result;
size_t len=max(Al,Bl);
int carry=0;///carry为进位
for(size_t i=0;i<len;i++)
{
int x=(A[i]-'0')+(B[i]-'0')+carry;///两个数字的第i位加上前一个数字的进位
result+=((x%10)+'0');
carry=x/10;
}
if(carry)
result+=(carry+'0');
result.assign(result.rbegin(),result.rend());
cout<<result<<endl;
if(n!=m-1)
cout<<endl;
}
return 0;
}
ps:这编辑器真不好用