【Likou】 43. Multiplication de chaînes (multiplication de grands nombres)<Simulation>

[Likou] 43. Multiplier des chaînes (multiplier de grands nombres)

Étant donné deux entiers non négatifs num1 et num2 représentés sous forme de chaînes, renvoie le produit de num1 et num2, également représentés sous forme de chaînes. REMARQUE : vous ne pouvez utiliser aucune des bibliothèques BigInteger intégrées ni convertir directement l'entrée en nombre entier.

Exemple 1 :
Entrée : num1 = « 2 », num2 = « 3 »
Sortie : « 6 »

Exemple 2 :
Entrée : num1 = « 123 », num2 = « 456 »
Sortie : « 56088 »

Astuces :
1 <= num1.length, num2.length <= 200
num1 et num2 ne peuvent être constitués que de nombres.
Ni num1 ni num2 ne contiennent de zéros non significatifs, à l'exception du nombre 0 lui-même.

répondre

Simulez le processus de multiplication. A chaque fois, chaque chiffre du multiplicateur est multiplié par le multiplicande, puis ajouté (l'addition est l'addition de grands nombres). Lors de la multiplication, il faut faire attention à ajouter 0 à la fin (car l'opération se fait à partir du petit chiffre au grand chiffre. , en fait, 0 est ajouté en premier)

[Likou] 415. Ajout de chaînes (ajout de grands nombres)

import java.util.Scanner;

public class BigNumMultiply {
    
    
    public static String multiply(String num1, String num2) {
    
    
        // num1 和 num2 之一是 0,返回0
        if (num1.equals("0") || num2.equals("0")) {
    
    
            return "0";
        }
        String ans = "0";

        // 从右往左遍历乘数
        for (int i = num2.length() - 1; i >= 0; i--) {
    
    
            // 当前乘的位
            int y = num2.charAt(i) - '0';
            StringBuffer curr = new StringBuffer();
            int add = 0;
            // 判断当前乘数所在的位,要补0
            for (int j = num2.length() - 1; j > i; j--) {
    
    
                curr.append(0);
            }

            // 每次遍历被乘数,逐位相乘
            for (int j = num1.length() - 1; j >= 0; j--) {
    
    
                int x = num1.charAt(j) - '0';
                int product = x * y + add;
                curr.append(product % 10);
                // 更新下一个进位
                add = product / 10;
            }
            // 最后的进位
            if (add != 0) {
    
    
                curr.append(add % 10);
            }
            // 被乘数与乘数的每一位 逐一相乘的结果再相加
            ans = addStrings(ans, curr.reverse().toString());
        }
        return ans;
    }

    public static String addStrings(String num1, String num2) {
    
    

        // 两个指针分别指向数字的末尾
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        //  add 维护当前是否有进位
        int add = 0;

        StringBuffer ans = new StringBuffer();

        // 加完 和进位完
        while (i >= 0 || j >= 0 || add != 0) {
    
    
            int x = i >= 0 ? num1.charAt(i) - '0' : 0;
            int y = j >= 0 ? num2.charAt(j) - '0' : 0;

            // 当前的和
            int result = x + y + add;
            // 最后的结果加上这个位的数字
            ans.append(result % 10);
            // 更新下一个进位
            add = result / 10;
            i--;
            j--;
        }

        // 计算完以后的答案需要翻转过来
        ans.reverse();
        return ans.toString();
    }

    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        String a = in.next();
        String b = in.next();

        String resultString = multiply(a, b);
        System.out.println(resultString);
    }
}

おすすめ

転載: blog.csdn.net/qq_44033208/article/details/132774082