描述 | |
---|---|
知识点 | 字符串 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | 输入两个字符串 |
输出 | 输出给求和后的结果 |
样例输入 | 9876543210 1234567890 |
样例输出 | 11111111100 |
#include<iostream>
#include<string>
using namespace std;
string add(string,string);
string subtract(string,string);
int main(void)
{
string s1,s2;
cin>>s1>>s2;
if(s1[0]=='-'&&s2[0]!='-'||s1[0]!='-'&&s2[0]=='-')//有一个减号的情况
cout<<subtract(s1,s2);
else if(s1[0]=='-'&&s2[0]=='-')//两个数都有减号的情况,先把减号去掉,利用加法最后加上负号即可
{
s1=s1.substr(1,s1.size()-1);
s2=s2.substr(1,s2.size()-1);
cout<<"-"+add(s1,s2);
}
else //两个数都没有减号的情况
cout<<add(s1,s2);
//system("pause");
return 0;
}
string add(string s1,string s2)
{
string s3;
int len_short,len_long;
if(s1.size()>s2.size())
{
len_short=s2.size();
len_long=s1.size();
s3=s1;
}
else
{
len_short=s1.size();
len_long=s2.size();
s3=s2;
}
int flag=0;
int tmp;
for(int i=1;i<=len_short;i++)
{
tmp=s1[s1.size()-i]-'0'+s2[s2.size()-i]-'0'+flag;
if(tmp>9)
{
s3[s3.size()-i]=tmp-10+'0';
flag=1;
}
else
{
s3[s3.size()-i]=tmp+'0';
flag=0;
}
}
for(int i=0;i<s3.size()-len_short;i++)
{
tmp=s3[i]-'0'+flag;
if(tmp>9)
{
s3[i]=tmp-10+'0';
flag=1;
}
else
flag=0;
}
if(flag==1)
s3="1"+s3;
return s3;
}
string subtract(string s1,string s2)
{
string sshort,slong,neg;//分别为较长整数、较短整数。如果是长整数-短整数,直接得出结果,如果是短整数-长整数,结果加负号,neg保存是否需要负号
if(s1[0]=='-')
{
s1=s1.substr(1,s1.size()-1);
if(s1.size()==s2.size())
{
for(int i=0;i<s2.size();i++)
if(s1[i]>s2[i])
{
neg="-";
break;
}
}
else if(s1.size()>s2.size())
neg="-";
if(neg=="-")
{
slong=s1;
sshort=s2;
}
else
{
slong=s2;
sshort=s1;
}
}
else if(s2[0]=='-')
{
s2=s2.substr(1,s2.size()-1);
if(s1.size()==s2.size())
{
for(int i=0;i<s2.size();i++)
if(s2[i]>s1[i])
{
neg="-";
break;
}
}
else if(s2.size()>s1.size())
neg="-";
if(neg=="-")
{
slong=s2;
sshort=s1;
}
else
{
slong=s1;
sshort=s2;
}
}
int flag=0;
int tmp;
for(int i=1;i<=sshort.size();i++)
{
tmp=slong[slong.size()-i]-sshort[sshort.size()-i]-flag;
if(tmp<0)
{
slong[slong.size()-i]=tmp+10+'0';
flag=1;
}
else
{
slong[slong.size()-i]=tmp+'0';
flag=0;
}
}
for(int i=0;i<slong.size()-sshort.size();i++)
{
tmp=slong[i]-'0'-flag;
if(tmp<0)
{
slong[i]=tmp+10+'0';
flag=1;
}
else
flag=0;
}
if(slong.size()!=1)
{
int pos=slong.find_first_not_of('0',0);//对于结果中前面有0的,比如88-89,经过上面的计算为01,下面是将0去掉。
if(pos!=-1)
slong=slong.substr(pos,slong.size()-pos);
else
slong="0";
}
if(flag==1&&neg!="-"||flag!=1&&neg=="-")
slong="-"+slong;
return slong;
}