//高精度减法,应该还可以优化
//正数减正数、正数减负数、负数减正数、负数减负数、大数减小数、小数减大数都考虑到了
//请保证输入的数的合法性
#include<iostream>
using namespace std;
#define MAXSIZE 50
void minus(char *x1, char *x2)
{
int a[MAXSIZE], b[MAXSIZE], tmp[MAXSIZE], ans[MAXSIZE];
int l1, l2, i, st, p1=0, p2=0, pt, pm, pos;
bool m1, m2, chg;
for(i=0; i<MAXSIZE; i++)
a[i]=b[i]=tmp[i]=ans[i]=0;
m1=(x1[0]=='-');
m2=(x2[0]=='-');
if(!m1 && !m2) st=1;
else if(m1 && !m2) st=2;
else if(!m1 && m2) st=3;
else if(m1 && m2) st=4;
l1=strlen(x1);
if(m1) for(i=l1-1; i>=1; i--)
{
a[p1]=x1[i]-'0';
p1++;
}
else for(i=l1-1; i>=0; i--)
{
a[p1]=x1[i]-'0';
p1++;
}
l2=strlen(x2);
if(m2) for(i=l2-1; i>=1; i--)
{
b[p2]=x2[i]-'0';
p2++;
}
else for(i=l2-1; i>=0; i--)
{
b[p2]=x2[i]-'0';
p2++;
}
pm=p1>p2?p1:p2;
if(st==1 || st==4)
{
chg=(p1<p2);
if(p1==p2) for(i=p1-1; i>=0; i--)
if(a[i]<b[i])
{
chg=true;
break;
}
else if(a[i]>b[i]) break;
if(chg)
{
for(i=0; i<p1; i++) tmp[i]=a[i];
for(i=0; i<p2; i++) a[i]=b[i];
for(i=0; i<p1; i++) b[i]=tmp[i];
for(i=p1; i<p2; i++) b[i]=0;
pt=p1; p1=p2; p2=pt;
}
for(i=0; i<pm; i++)
ans[i]=a[i]-b[i];
for(i=0; i<MAXSIZE-1; i++)
while(ans[i]<0)
{
ans[i]+=10;
ans[i+1]--;
}
if((st==1 && chg) || (st==4 && !chg)) cout<<"-";
}
else
{
for(i=0; i<pm; i++)
ans[i]=a[i]+b[i];
for(i=0; i<MAXSIZE-1; i++)
while(ans[i]>9)
{
ans[i]-=10;
ans[i+1]++;
}
if(st==2) cout<<"-";
}
pos=MAXSIZE-1;
while(pos>-1 && !ans[pos]) pos--;
if(pos==-1) cout<<"\b0";
for(i=pos; i>=0; i--) cout<<ans[i];
cout<<endl;
}
int main()
{
char x1[MAXSIZE], x2[MAXSIZE];
cin>>x1>>x2;
minus(x1,x2);
return(0);
}
温馨提示:答案为网友推荐,仅供参考