大きな整数の乗算は実際には非常に簡単です(Java)

大きな整数の乗算は実際には非常に簡単です(Java)

目的と紹介

  • Java言語を使用して大きな整数の乗算を実現する
  • 大きな整数が乗算される限り、大きな整数の加算、減算、および除算は非常に簡単です
  • 大きな整数を追加します。キャリー演算にはループのみが必要です
  • 大きな整数を減算し、ループで借りるだけでよいので、符号に注意してください。
  • 大きな整数の除算は、単に大きな整数を複数回減算することです。

デザインのアイデア

  • 数学的な乗算をシミュレートし、ビットを乗算し、最後に追加します
  • 追加するとき、下位ビットが10を超える場合、前進します

具体的な手順

  • 演算子が最初に判断され、最終結果は正または負です。
  • 手動操作を転送できますが、コンピュータは文字列の反転を実行します。これは計算と保存に便利です。
  • 計算の結果については、それを格納する場所を見つける必要があります。新しい配列のサイズは、2つの数値の積の桁数であり、2桁の合計を超えません。
  • 計算と数値処理を実行(キャリー)
  • 余分な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();
    }
}

テストケース設計

  • 負の数を掛けた負の数をテストする
  • 正の数に負の数を掛けてテストする
  • 99 999999の倍数は、9999の倍数を与える9数学的な関係、認証の数を乗算するため(nで構成される2つの同一9、結果はn-1 9 8 + 1 + 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

おすすめ

転載: blog.csdn.net/ljfirst/article/details/106131371