输入描述:
输入两个字符串
输出描述:
输出给求和后的结果
//本算法支持正正,负负和一正一负四种情况。
//负负时,去掉两个前导符,然后转化为加法;
//一正一负时,先比较操作数大小,然后做减法
#include <string>
#include <iostream>
using namespace std;
string add(string s1,string s2);
string sub(string s1,string s2);
int main()
{
string s1;string s2;
while(cin>>s1>>s2)
{
if(isdigit(s1[0])&&isdigit(s2[0]))
cout<<add(s1,s2)<<endl;
else if(!isdigit(s1[0])&&!isdigit(s2[0]))
{
s1=s1.substr(1);s2=s2.substr(1);
cout<<'-'+add(s1,s2)<<endl;
}
else if(isdigit(s1[0])&&!isdigit(s2[0]))//一正一负时先去掉前导-,然后补齐再比较操作数的大小
{
s2=s2.substr(1);
if(s1.size()>s2.size()) s2=string(s1.size()-s2.size(),'0')+s2;//去掉前导后补齐两个字符串
else s1=string(s2.size()-s1.size(),'0')+s1;//由于要判断s1,s2的大小,所以要先补齐再判断
if(s1>s2) cout<<sub(s1,s2)<<endl;//如123,-57,去掉前导-然后调用减法函数
else cout<<'-'+sub(s2,s1)<<endl;//如23,-157,去掉前导-,交换位置后调用减法函数再加上前导-
}
else
{
s1=s1.substr(1);
if(s1.size()>s2.size()) s2=string(s1.size()-s2.size(),'0')+s2;
else s1=string(s2.size()-s1.size(),'0')+s1;//去掉前导后补齐两个字符串
if(s1>s2) cout<<'-'+sub(s1,s2)<<endl;//如-123,57
else cout<<sub(s2,s1)<<endl;//如-23,157
}
}
}
string add(string s1,string s2)//字符串加法
{
string res="";
if(s1.size()>s2.size()) s2=string(s1.size()-s2.size(),'0')+s2;
else s1=string(s2.size()-s1.size(),'0')+s1;//去掉前导后补齐两个字符串
int carry=0;
for(int i=s1.size()-1;i>=0;i--)
{
char temp=(s1[i]-'0'+s2[i]-'0'+carry)%10+'0';
res=temp+res;
carry=(s1[i]-'0'+s2[i]-'0'+carry)/10;
}
if(carry) res='1'+res;
return res;
}
string sub(string s1,string s2)//减法,主函数处理后保证结果是正数
{
string res="";
int borrow=0;int i=s1.size()-1;
for(;i>=0;i--)
{
int op1=(s1[i]-borrow>=s2[i])?(s1[i]-borrow-'0'):(10+s1[i]-borrow-'0');
int op2=s2[i]-'0';
char temp=op1-op2+'0';
res=temp+res;
borrow=s1[i]-borrow<s2[i];
}
while(res[++i]=='0');//去掉前导0
res=res.substr(i);
return res;
}