java大数算法完成五则运算之乘

到了乘法部分了,乘法呢稍微麻烦点

如图所示,下面的每一位乘以上面的乘数时都要将分积的位提前,最后根据分积的位来对应加起来即为最终结果。麻烦就来了,每一部分的积考虑到可能为大数,那么必须使用数组来存放,这么多的分积如果都使用单个数组来存放,不仅麻烦而且浪费资源,并且记录分积在总积中的位也是个问题,这种情况下我自然而然的想到了二维数组来存放,每一行就是一个分积,在计算总积时却有问题了,没法保证每个分积正确的错位相加,想了几个方法都不行,比如在前后补零使得位数一致,但是前置位的零很好区别删除,后置位却没法分辩等等。


于是我去博客上看看有没有类似的文章可以借鉴,运气不错,还真找到了一个。

原地址:浅谈一下大数相乘有关思路(图解)与用java代码具体解决方案

原博客主的思路:


原博客主的思路与我类似,利用正斜线相加的方法巧妙的帮我解决了分积相加的问题,同时更简单,在他的思路中,分积不用进位,将分积全部相加之后,再来进位。


思路完结,上代码~~关于类中的其它方法和属性详看java大数算法完成五则运算之类基础,这里就不再讲了

public BigNum mul(BigNum mul) throws Exception {
        int mulNum[] = mul.NUM;//要乘的大数数组
        char newNumSign = 0;//积数的符号
        int newNum[] = null;//积数的数组
        if (SIGN == mul.SIGN) {//同号为正,异号为负
            newNumSign = '+';
        } else {
            newNumSign = '-';
        }
        newNum = mulNum(NUM, mulNum);
        BigNum b = new BigNum(newNum, newNumSign);
        return b;
    }

    /**
     * 大数数组相乘,不分符号
     *
     * @param b
     * @return
     */
    private int[] mulNum(int a[], int b[]) {
        //productNum存放两个数组每个数字互相相乘的积
        int productNum[][] = new int[a.length][b.length];
        //num存放积数,num长度范围,最大:两个数组长度的和,最小:两个数组长度的和减一
        //这里先用最小范围存放,第一位暂时不进位即可
        int num[] = new int[a.length + b.length - 1];
        for (int i = 0; i < a.length; i++) {//两两相乘
            for (int j = 0; j < b.length; j++) {
                productNum[i][j] = a[i] * b[j];
            }
        }
        //二维数组中每一条正斜线的和正是对应位的总积值
        for (int t = 0; t < num.length; t++) {
            for (int i = 0; i < a.length; i++) {
                for (int j = 0; j < b.length; j++) {
                    if (t == i + j) {
                        num[t] += productNum[i][j];
                    }
                }
            }
        }
        for (int i = num.length - 1; i > -1; i--) {//从左往右进位,第一位不进位
            if (num[i] > 9 && i > 0) {
                num[i - 1] += num[i] / 10;
                num[i] %= 10;
            }
        }
        if (num[0] > 9) {//如果第一位需要进位,则先转换成字符串在转换成数组即可
            String s = intArrToString(num);
            num = stringToIntArr(s);
        }
        return num;
    }

最后万分感谢原博客主的分享~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值