写的好搓 先放着
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string jianfa(string a,string b,char f)
{
if(a.compare(b)==0)
{
string c="0";
return c;
}
string c="",ans="",t;
int flag=0,k=0;//flag退位的标志
int flag2;//结果正负的标志
if(f=='+')
flag2=0;
else
flag2=1;
if(a.length()<b.length()||(a.length()==b.length()&& a.compare(b)<0))
{
t=a;
a=b;
b=t;
flag2^=1;
}
int i=a.length()-1,j=b.length()-1;
while(i>=0&&j>=0)
{
if(a[i]+flag>b[j])
{
c+=a[i]+flag-b[j]+'0';
flag=0;
}
else if (a[i]+flag==b[j])
{
c+='0';
flag=0;
}
else
{
c+=(a[i]-'0')+flag+10-(b[j]-'0')+'0';
flag=-1;
}
i--;j--;k++;
}
int len=k-1;
while(c[len]=='0'&&len>0)
len--;//检索高位
for(j=0;j<=len;j++)
ans+=c[j];
if(flag2)
{
ans+='-';
}//结果正负判断
char tt;
for(i=0,j=ans.length()-1;i<j;i++,j--)//倒置
{
tt=ans[i];
ans[i]=ans[j];
ans[j]=tt;
}
return ans;
}
int main()
{
string a,b;
while(cin>>a>>b&&(a[0]!='0'||b[0]!='0'))
{
string s1(a.begin()+1,a.end());
string s2(b.begin()+1,b.end());
if(a[0]==b[0])
{
cout<<jianfa(s1,s2,a[0])<<endl;
}
else
{
int num1[150],num2[150];
int ans[150];
memset(ans,0,sizeof(ans));
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
int l1=s1.size(),l2=s2.size();
int i,j;
for(i=l1-1,j=0;i>=0;i--,j++)
num1[j]=s1[i]-'0';
for(i=l2-1,j=0;i>=0;i--,j++)
num2[j]=s2[i]-'0';
int max=l1>l2?l1:l2;
for(i=0;i<max;i++)
{
ans[i]+=num1[i]+num2[i];
if(ans[i]>9)
{
ans[i+1]+=ans[i]/10;
ans[i]=ans[i]%10;
}
}
if(b[0]=='+')
cout<<"-";
int flag=1;
for(i=max+1;i>=0;i--)
if(flag&&ans[i]==0)
continue;
else
{
flag=0;
cout<<ans[i];
}
cout<<endl;
}
}
return 0;
}