关于大数减法其核心就是:减法的算法也是从低位开始减,先要判断减数和被减数那一个位数长,被减数位数长是正常减;减数位数长,则减数-被减数,最后还要加上负号;两个位数长度相等时,最好比较哪一个数大,否则负号会处理的很繁琐;处理每一项时,要先按对应的位用被减数减去减数,用数组存入,如果差小0,需要向上一位借位,再把这一位的差加10,以此类推。
代码如下:
//大数减法
#include<stdio.h>
#include<string.h>
#define M 100005
using namespace std;
char s1[M],s2[M],s[M];
int a[M],b[M],c[M];
/*较大数减去较小数,即正常减*/
void ss(char s1[],char s2[],int n,int m)
{
int i,j,a[M],b[M];
for(i=0; i<n; i++)
a[i]=s1[n-i-1]-'0';
for(i=0; i<m; i++)
b[i]=s2[m-i-1]-'0';
for(i=0; i<n; i++)
c[i]=a[i]-b[i];
for(i=0;i<n;i++)
if(c[i]<0)
{
while(c[i]<0)
{
c[i+1]=c[i+1]-1;//借位(高位减一,低位加十)
c[i]+=10;
}
}
}
int main()
{
int n,m,i,j,k,kk;
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
while(~scanf("%s%s",s1,s2))
{
n=strlen(s1);
m=strlen(s2);
printf("s1=%d s2=%d\n",n,m);
if(n>m)
ss(s1,s2,n,m);
else if(n<m)
{
printf("-");
ss(s2,s1,m,n);
}
else
{ /*当两个数位数相同时,判断两个数的大小 */
k=strcmp(s1,s2);
/*strcmp()函数:从第一位开始比较两个字符串大小(不管位数多少)
k>0则s1较大,k<0则s2较大,k=0则s1=s2*/
if(k==0)
{
printf("0\n");
continue;
}
else if(k>0)
ss(s1,s2,n,m);
else
{
printf("-");
ss(s2,s1,m,n);
}
}
if(n>m) kk=n;
else kk=m;
while(c[kk]==0) kk--;//排除前导0
for(i=kk; i>=0; i--)
printf("%d",c[i]);
printf("\n");
}
return 0;
}