大数运算(3)——大数减法

大数的减法与大数加法的方法有相似之处的,都是模拟人工运算的,从最低位开始运算,一直到最高位。

其方法是:

首先,要判断减数和被减数哪一个位数长,减数位数长是正常减;被减数位数长,则被减数减减数,最后还要加上负号;两数位数长度相等时,最好比较一下哪一个数字大,否则负号处理会很繁琐,用大的减去小的,最后加上负号;

其次,处理每一项时要,如果前一位相减有借位,就先减去上一位的借位,无则不减;再去判断是否能够减开被减数,如果减不开,就要借位后再去减,同时置借位为1,否则置借位为0。

结果可能会出现前面是一堆0的情况,要处理好,如当减数为112,而被减数为111时,会出现001 ,这时,需要将前面的0删除。

例如:13154-21213(同样,从最低位开始相减)

   3  2  1  2  2

- 4  5  1  3  1

————————

  9    //向前一位借1,则前一位的2变为1

      6    // 2---->1向前一位借1,则前一位的1变为0

          9    //1---->0向前一位借1,则前一位的2变为1

              8      //2---->1向前一位借1,则前一位的2变为1

                   0    //不用借位。

  9  6  9  8  0      //当然,输出时将0删除,并加上负号,即-9896

下面是C语言代码实现:

#include<stdio.h>  
#include<string.h>  
int x[100]={0},y[100]={0},z[105]={0};//将数组元素全部初始化为0  
void sub(int x[],int y[],int len)  
{  
    int i,j;  
    for(i=0;i<len;i++)  
    {  
        if(x[i]>=y[i])//如果x[i]>=y[i],不用向前一位借1,可直接减   
            z[i]=x[i]-y[i];  
        else  //如果x[i]<y[i],向前一位借1,同时前一位应减1   
        {  
            z[i]=x[i]+10-y[i];  
            x[i+1]=x[i+1]-1;  
        }      
    }  
    for(i=len-1;i>0;i--)//删除前缀0   
    {  
        if(z[i]==0)  
            len--;  
        else  
            break;   
    }  
    for(i=len-1;i>=0;i--)  //倒序输出数组   
        printf("%d",z[i]);  
    printf("\n");  
}  
int main()  
{  
    char a[100],b[100];//通过字符串对大数进行输入并储存   
    int len1,len2;  
    while(scanf("%s %s",a,b))  
    {  
        int i,j=0,k=0;  
        len1=strlen(a);  
        len2=strlen(b);  
        for(i=len1-1,j=0;i>=0;i--)//将两个字符串中的字符转化为数字,并倒序储存到数组中,即字符串为123456,则数组为654321   
            x[j++]=a[i]-'0';  
        for(i=len2-1,k=0;i>=0;i--)  
            y[k++]=b[i]-'0';  
        if(len1>len2)  //若减数长度 > 被减数,正常减   
            sub(x,y,len1);  
        else if(len1<len2)  //若减数长度 < 被减数,被减数 减 减数  
        {  
            printf("-");  
            sub(y,x,len2);  
        }   
        else  //若减数长度 == 被减数,判断两个数的大小   
        {  
            for(i=len1-1;i>=0;i--)//判断每一位两个数的大小  
            {  
                if(x[i]==y[i])  
                    continue;  
                if(x[i]>y[i])//即减数大   
                {  
                    sub(x,y,len1);  
                    break;  
                }      
                if(x[i]<y[i])//即被减数大   
                {  
                    printf("-");  
                    sub(y,x,len1);  
                    break;   
                }      
            }  
        }   
    }  
    return 0;   
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值