2つの特に大きな数を乗算します(BigDecimalは許可されていません)

大きな数を掛けるという考え方は、2つの大きな数を足すのと同じですが、ロジックが面倒な場合があります。まず、それを設計しましょう。

1. 2つの大きな数を乗算することは、それらを乗算用の配列に変換することに他なりません。ただし、2つの配列を乗算し、ループして加算するのは面倒でエラーが発生しやすいため、配列を使用して数値を乗算してから、これらを乗算します。以下では、配列と数値を乗算するコードを記述しています。もちろん、最後の数値は直接乗算できますが、前の数値はどうでしょうか。後で0を追加する必要があるため、オフセットが必要であり、レコード追加の計算後にいくつかの0を追加します。

2.配列に数値を掛けます。これは少し簡単です。つまり、配列をトラバースし、各数値を乗算してから加算します。ただし、最後に加えて、他の加算に0を入力する必要がある場合があります。したがって、数値と数値を計算する方法を定義しています。乗算するには、次に0を追加します。これは非常に単純で明確です。

3.数値を乗算する数値を定義し、ゼロフィル操作を追加します。これは簡単なはずです。変換後、乗算してゼロフィル操作をトラバースします。

以下のコードを共有させてください。いくつかの提案をいただければ幸いです。

まず、コードを追加し、最後のコードを取得する必要があります

 //两个大数字相加
    public static String numberPlus(String s1, String s2) {

        //将数字转换成char类型的数组,然后每一位进行运算
        char[] char1;
        char[] char2;

        //计算前区分,令char1 为长的那个字符创转换成的数组.+
        if (s1.length() > s2.length()) {
            char1 = s1.toCharArray();
            char2 = s2.toCharArray();
        } else {
            char1 = s2.toCharArray();
            char2 = s1.toCharArray();
        }
        //flag 进位标识,末位相加进位的话前面一位需要加上进位
        int flag = 0;
        //创建一个list接收两个数组相加的结果
        List<Integer> resultList = new ArrayList<>();
        //遍历相加
        for (int i = char1.length - 1; i >= 0; i--) {
            //字母与数字之间的类型转换
            int a = Integer.parseInt(String.valueOf(char1[i]));
            //初始化,数组char2 短一些
            int b = 0;
            //计算,使得char1与char2 末位相加
            if (i - (char1.length - char2.length) >= 0) {
                b = Integer.parseInt(String.valueOf(char2[i - (char1.length - char2.length)]));
            }
            //两个数字相加,同时加上进位,
            //注意:flag 的设置一定要放在相加后面,因为相加要使用当前的flag,如果提前设置,flag的作用就没有起到。
            resultList.add((a + b + flag) % 10);
            flag = (a + b + flag) / 10;
        }
        //最后进位处理
        if(flag!=0){
            resultList.add(flag);
        }

        StringBuffer buffer = new StringBuffer();
        //逆向遍历,因为加的时候是从末位开始加的,首位的在后面。
        for (int i = resultList.size() - 1; i >= 0; i--) {
            buffer.append(resultList.get(i));
        }
        //相加结果字符串返回。
        return buffer.toString();
    }

次に、3番目のステップのコードの記述を開始し、数値に数値を掛けてから、0を加算します。

 //计算某位与一个数字相乘:s1:某位的数字,s2:相乘的数字,offset:就是后面
    //要补几个零
    public static String mulit(String s1, String s2, Integer offset) {
        //s1与s2都必须是一位,否则直接返回空
        if (s1.length() != 1 || s2.length() != 1) {
            return null;
        }
        int num = Integer.parseInt(s1) * Integer.parseInt(s2);
        StringBuffer buffer = new StringBuffer(String.valueOf(num));
        if (offset >= 1) {
            for (int i = 1; i <= offset; i++) {
                buffer.append("0");
            }
        }
        return buffer.toString();
    }

次に、配列を計算して数値を乗算し、さらに0を加算します

  //一个数组与一个数字相乘
    public static String numMulit(char[] chars, String s, Integer offset) {

        if (s.length() != 1) {
            return null;
        }

        String result = "0";
        for (int i = chars.length - 1; i >= 0; i--) {
            String temp = mulit(String.valueOf(chars[i]), s, chars.length - i - 1);
            result = numberPlus(temp, result);
        }
        StringBuffer buffer = new StringBuffer(result);
        if (offset >= 1) {
            for (int i = 1; i <= offset; i++) {
                buffer.append("0");
            }
        }
        return buffer.toString();
    }

最後に、2つの配列の乗算を計算します

 //两个大数字相乘
    public static String numMulitfy(String s1, String s2) {

        char[] chars1 = s1.toCharArray();
        char[] chars2 = s2.toCharArray();

        String result = "0";

        for (int i = chars1.length - 1; i >= 0; i--) {
            String temp = numMulit(chars2, String.valueOf(chars1[i]), chars1.length - i - 1);
            result = numberPlus(result, temp);
        }
        return result.toString();
    }

走らせてみよう〜

 public static void main(String[] args) {
        //定义俩个大数字
        String s1 = "124354765868776765455344234299999993";
        String s2 = "823435435888888888888888435499";
        //使用BigDecimal,方便后面直接计算正确结果进行对比。
        BigDecimal b1 = new BigDecimal(s1);
        BigDecimal b2 = new BigDecimal(s2);

        System.out.println("程序:" + numMulitfy(s1, s2));
        System.out.println("真实:" + b1.multiply(b2));

    }

結果は当然レバードロップです:

                                                                                                                                      みなさん、また会いましょう〜

おすすめ

転載: blog.csdn.net/zsah2011/article/details/82634265