大数相减主要考虑借位和借位出现的前导零以及负值问题。
#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string posi_subtract(string st1,string st2) //结果为正值
{
string finstr;
reverse(st1.begin(),st1.end());
reverse(st2.begin(),st2.end());
int in=0,num=0,len1=st1.size(),len2=st2.size();
for(int i=0; i<len2; i++)
{
st1[i]=st1[i]-'0'+in+'0';
if(st1[i]>=st2[i])
{
in=0;
st1[i]=(st1[i]-'0')-(st2[i]-'0')+'0';
}
else
{
in=-1;
st1[i]=st1[i]+':'-st2[i];
}
}
for(int j=len2; j<len1; j++)
{
st1[j]=st1[j]-'0'+in+'0';
if(st1[j]>='0')
{
in =0;
}
else
{
in=-1;
st1[j]=st1[j]-'0'+10+'0';
}
}
reverse(st1.begin(),st1.end());
int i;
for(i=0; i<len1-1; i++) //去除前导零
{
if(st1[i]!='0')
break;
}
for(int j=i; j<len1; j++)
{
finstr+=st1[j];
}
return finstr;
}
string nega_subtract(string st1,string st2) //结果为负值
{
string s;
s=posi_subtract(st1,st2);
reverse(s.begin(),s.end());
s+='-'; //尾部添加符号
reverse(s.begin(),s.end());
return s;
}
string subtraction(string st1,string st2) //相减函数
{
if(st1.length()>st2.length()) //比较两个string的长度分三种情况
return posi_subtract(st1,st2);
else if(st1.length()==st2.length())
{
if(st1>st2)
return posi_subtract(st1,st2);
else if(st1<st2)
return nega_subtract(st2,st1);
else //st1==st2
return posi_subtract(st1,st2);
}
else if(st1.length()<st2.length())
{
return nega_subtract(st2,st1);
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
string str1,str2;
cin>>str1>>str2;
cout<<subtraction(str1,str2)<<endl;
}
return 0;
}
样例:
105162
1004620
-999458
5162
124620
-119458
5162
114620
-109458