和加法一样,也是模拟手算,但要注意:
1、不够减时向高位借位,高位-1,低位+10;
2、去除高位多余的0,但要注意至少保留一位;
3、相减之前需先比较两个数的大小,若被减数小于减数,需要交换两个数,并输出‘-’号。
参考代码:
#include <cstdio>
#include <cstring>
struct bign{
int d[1000];
int len;
bign()
{
memset(d,0,sizeof(d));
len=0;
}
};
bign change(char str[])
{
bign a;
a.len=strlen(str);
for(int i=0;i<a.len;++i)
{
a.d[i]=str[a.len-i-1]-'0'; //注意-'0'
}
return a;
}
bign sub(bign a,bign b)
{
bign c;
for(int i=0;i<a.len||i<b.len;++i) //以较长的为界限
{
if(a.d[i]<b.d[i]) //不够减
{
a.d[i+1]--; //向高位借位
a.d[i]+=10; //当前位+10
}
c.d[c.len++]=a.d[i]-b.d[i]; //减法结果为当前位结果
}
while(c.len-1>=1&&c.d[c.len-1]==0) //去除高位的0,同时至少保留一位最低位
c.len--;
return c;
}
int compare(bign a,bign b)
{
if(a.len>b.len)
return 1;
else if(a.len<b.len)
return -1;
else
{
for(int i=a.len-1;i>=0;--i)
{
if(a.d[i]>b.d[i])
return 1;
else if(a.d[i]<b.d[i])
return -1;
}
return 0;
}
}
void print (bign c)
{
for(int i=c.len-1;i>=0;--i)
{
printf("%d",c.d[i]);
}
printf("\n");
}
char s1[1000],s2[1000];
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
bign a=change (s1);
bign b=change (s2);
int k=compare(a,b);
if(k==-1)
{
bign temp=a;
a=b;
b=temp;
printf("-");
}
bign c=sub(a,b);
print(c);
}
return 0;
}