C语言:大整数减法

大整数减法日常练习总结

对于大整数问题,逻辑1.先是比较两输入字符串的大小,经检验,strcmp只能比较相同位数的两串,不同位数会按照
较短那串的位数进行比较,故不能满足任意大整数的两两比较,
对于完美实现,要判断二者位数长度时,要么直接能对比出长度先,要么二者同长时用strcmp。故语句为if(la>lb||(la==lb&&strcmp(a,b)>0))
2.在对比大小之后,进行加减操作,加减时要注意的是进位和舍位操作,计算机语言为负数加十为进位,整数减十为舍位

int main()
{
        int la,lb,maxlen,k;
        char a[100],b[100];
        int a1[100]={0},b1[100]={0};
        int i,m;
        char r[100];
        gets(a);        //输入的数字a,是个字符串
        gets(b);        //输入的数字b
        la=strlen(a);   //a数字的记位器
        lb=strlen(b);   //b的
        if(la>lb)
        maxlen=la;      //如果 a 位数长,那么 a 当大数
        else
        maxlen=lb;      //反之则 b
        if(la>lb||(la==lb&&strcmp(a,b)>0))       //两字符串比较(即为俩数字比较)a > b 时
        {
                m=maxlen;       //m 用来存刚才对比过后的二者中较大的位数 maxlen
                for(i=0;i<la;i++,m--)   //
                        a1[m]=a[la-1-i]-'0';//这里是进行了将输入的字符串变成数字数组的操作,
                                                //注意最高位空出来,防止溢出
                m=maxlen;
                for(i=0;i<lb;i++,m--)
                        b1[m]=b[lb-1-i]-'0';//减去字符0就是减去了32,字符串串变成了数字串存每个数字
        }
        else            //这里为后面进行b串-a串的操作做准备
        {
                m=maxlen;
                for(i=0;i<lb;i++,m--)
                        a1[m]=b[lb-1-i]-'0';    //改写a1串,注意这是else,a1存大的,此时b是大的,把b放a1中
                m=maxlen;
                for(i=0;i<la;i++,m--)
                        b1[m]=a[la-1-i]-'0';    //改写b1串
        }
        //减法(在二者在上面进行了比较为大小之后,这里直接进行大数减小数
        for(i=maxlen;i>=0;i--)
        {
                a1[i]-=b1[i];
                if(a1[i]<0)//这里是进行了借位,如 1-8,等于3,在计算机中实则是 -7+10
                {
                    a1[i]=a1[i]+10;
                    a1[i-1]--;//借了位被借位处要减一
                }
        }
        if(la<lb||(la==lb&&strcmp(a,b)<0))//两字符串比较(即为俩数字比较)a < b 时
        printf("-");//这个if就是为了输出这个负号

        for(i=1;i<=maxlen;i++)
        printf("%d",a1[i]);

}
  • 13
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值