java语言BigInteger减法模拟实现

本文详细描述了如何在Java中的自定义MyBigInteger类中实现大数减法,包括处理空字符串、补零、位移以及借位操作的过程,提供了完整的算法步骤和示例代码。
摘要由CSDN通过智能技术生成

在Java BigInteger 减法他们虽然用的是比较高级的一些算法,但我们可以实现像数学的日常使用的减法法则;

不过代码有点过于长,需要注意很多细节;

算法流程如下;

我用的虽然是自己构造的MyBigInteger 类但你们可以通过String类来进行减法;

1,我们有两个String来存储我们想要的大数;

2,然后最前面要判断是否期中一个String是为空?

若是         

        那么把结果给期中不为空的那一个

若不是

        那么要看两个String的长度哪一个比较长如果a的长度小于b或b小于a那么;

     比如 ;a =  234 b = 1234 那么要在a前面补零,因为我们需要从最后低位开始进行减法

在这个例子   0234 - 1234 从 4 开始减;所以补零很重要,否子我们的减法有问题

如果长度相等那么正好不需要补零;

然后需要把两个String 反过来,因为从最后一位开始减;

然后开始一位一位的减;

        有个函数判断a是大于小于还是等于b,

若 大于那么直接减

若等于那么

对应的结果 0

若小于

那么需要处理一下,我们可以以十进制为主来做一下操作

比如  a = 7 - b = 8 那么 a 先判断前面是否还有数

如果没有那么直接减

        如果有那么借以

a+=10;

a = 17;

a-b = 9;

carry = 1;

然后每次a 需要减一个 carry 

我们这样的思路可以实现BigInteger 的减法操作;

代码很多地方可以优化的,你们自己仔细看;

public String subtract(MyBigInteger s) {
        String sign = "+";
        int tmp[] = new int[this.SIZE + s.SIZE];
        int actualSize = 0;
        if (this.SIZE != 0 && s.SIZE == 0) {
            return this.toString();
        } else if (this.SIZE == 0 && s.SIZE != 0)
            return s.toString();
        else {
            int carry = 0;
            if (this.SIZE >= s.SIZE) {
                int i;
                for (i = 0; i < this.SIZE && i < s.SIZE; i++) {
                    int a = this.arr[i] - carry;
                    int b = s.arr[i];
                    if (bigSmallEqual(a, b) == 1) {
                        tmp[actualSize++] = a - b;
                        carry = 0;
                    } else if (bigSmallEqual(a, b) == -1) {
                        if (i < s.SIZE - 1) {
                            a += 10;  //需要从下一个数借1
                            carry = 1; //下次运算要减去carry
                            tmp[actualSize++] = a - b;
                        } else {
                            sign = "-";
                            tmp[actualSize++] = b - a;
                        }
                    } else {
                        carry = 0;
                        tmp[actualSize++] = 0;
                    }

                }
            } else if (this.SIZE - 1 < s.SIZE - 1) {
                sign = "-";

                int len = s.SIZE-this.SIZE;

                int []tp = new int[s.SIZE];
                int k;
                for(k = 0;k<len;k++){
                    tp[k] = 0;
                }
                for(int t = this.SIZE-1;t>=0;t--){
                    tp[k++] = this.arr[t];
                }

                reverseArr(tp);

                int i;
                for (i = 0; i < tp.length && i < s.SIZE; i++) {
                    int b  = tp[i];
                    int a = s.arr[i] - carry;
                    if (bigSmallEqual(a, b) == 1) {
                        tmp[actualSize++] = a - b;
                        carry = 0;
                    } else if (bigSmallEqual(a, b) == -1) {
                        if (i < this.SIZE - 1) {
                            a += 10;  //需要从下一个数借1
                            carry = 1; //下次运算要减去carry
                            tmp[actualSize++] = a - b;
                        } else {
                            sign = "-";
                            tmp[actualSize++] = b - a;
                        }
                    } else {
                        tmp[actualSize++] = 0;
                        carry = 0; //当两个都相等那么减法后是0不需要存储到数组
                    }

                }
            }
            
            String n = "";
            if (sign.charAt(0) == '-') //如果符号是-那么给他负数
                n += '-';

            int flag = 1;
            for (int i = actualSize - 1; i >= 0; i--) { //把开头的0去掉
                if(tmp[i]==0&&flag!=0){
                    while(tmp[i]==0)
                        i--;
                    flag=0;
                }
                n = n + "" + tmp[i];
            }

            return n;
        }
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值