大整数乘法其实很简单(Java)

大整数乘法其实很简单(Java)

目的及介绍

  • 使用Java语言实现大整数相乘
  • 只要弄的大整数相乘,大整数相加、减、除很简单
  • 大整数相加,只需要一个循环进行进位操作
  • 大整数相减,只需要在循环内进行借位,注意正负号即可
  • 大整数相除,就是多次的大整数相减。

设计思路

  • 模拟数学上的乘法,按位相乘,最后相加
  • 相加的时候,低位超过10的,向前进位

具体步骤

  • 首先进行运算符判断,对最后结果是正负有个数
  • 人工是可以正向运算的,但是计算机进行字符串逆置,方便计算和存储
  • 对于计算的结果,需要找地方存储,新数组的大小即两个数相乘的积位数,不会大于两数位数之和
  • 进行运算和数值处理(进位)
  • 记得把多余的0去掉,还有带上正负号

代码实现

public class BigIntegersMulti {
    
    
    //大整数乘法
    public String multi(String args, String args2) {
    
    
        StringBuffer sb = new StringBuffer(args);
        StringBuffer sb2 = new StringBuffer(args2);
        //运算符判断
        int signal = 0;
        if ("-".equals(args.substring(0, 1))) {
    
    
            sb.delete(0, 1);
            signal++;
        }
        if ("-".equals(args2.substring(0, 1))) {
    
    
            sb2.delete(0, 1);
            signal++;
        }
        //字符串逆置,方便计算和存储
        char[] ch = sb.reverse().toString().toCharArray();
        char[] ch2 = sb2.reverse().toString().toCharArray();
        //两个数相乘的积位数不会大于两数位数之和
        int length = ch.length + ch2.length;
        int[] sum = new int[length];
        //运算
        for (int i = 0; i < ch.length; i++) {
    
    
            for (int j = 0; j < ch2.length; j++) {
    
    
                sum[i + j] += (ch[i] - '0') * (ch2[j] - '0');
            }
        }
        //数值整理和进位
        for (int i = 0; i < length - 1; i++) {
    
    
            sum[i + 1] += (sum[i] / 10);
            sum[i] %= 10;
        }
        StringBuffer sb3 = new StringBuffer();
        //消除0,比如000123,应该输出123
        int u = length - 1;
        while (sum[u] == 0) {
    
    
            u--;
        }
        //逆序
        for (; u >= 0; u--) {
    
    
            sb3.append(sum[u]);
        }
        //带上运算符号
        if ((signal & 1) == 1) {
    
    
            sb3.insert(0, "-");
        }
        return sb3.toString();
    }
}

测试案例设计

  • 测试负数乘以负数
  • 测试正数乘以负数
  • 通过9999,99999999的数学关系得到9的倍数关系,进行验证(两个相同的n个9组成的数相乘,结果是由n-1个9加上一个8再加上n-1个0再加上一个1组成)
public void testmulti() {
    
    

        //测试负数乘以负数
        String s1 = "-12345679", s2 = "-12345679";
        String s3 = bigIntegersMulti.multi(s1, s2);
        assert s3.equals("152415789971041");
        //测试正数乘以负数
        s1 = "12345679";
        s2 = "-12345679";
        s3 = bigIntegersMulti.multi(s1, s2);
        assert s3.equals("-152415789971041");
        //测试9的倍数关系
        StringBuffer sb = new StringBuffer();
        StringBuffer sb1 = new StringBuffer();
        sb.append(9);
        for (int i = 1; i < 20; i++) {
    
    
            sb.append(9);
            s3 = bigIntegersMulti.multi(sb.toString(), sb.toString());
            for (int j = 0; j < i; j++) {
    
    
                sb1.append(9);
            }
            sb1.append(8);
            for (int j = 0; j < i; j++) {
    
    
                sb1.append(0);
            }
            sb1.append(1);
            assert s3.equals(sb1.toString());
            sb1 = new StringBuffer();
        }
    }

排坑细节

  • 忘记加上正负号
  • 没有消除0

Supongo que te gusta

Origin blog.csdn.net/ljfirst/article/details/106131371
Recomendado
Clasificación