【力扣】43. 字符串相乘(大数相乘)<模拟>

【力扣】43. 字符串相乘(大数相乘)

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"

输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"

输出: "56088"

提示:

1 <= num1.length, num2.length <= 200

num1 和 num2 只能由数字组成。

num1 和 num2 都不包含任何前导零,除了数字0本身。

题解

模拟相乘的过程。每次取乘数的每一位与被乘数相乘,然后相加(相加就是大数相加),在相乘的时候,需要注意在后面补0(因为是从小位到大位操作,实际是先补0)

【力扣】415. 字符串相加(大数相加)

java 复制代码
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);
    }
}
相关推荐
墨雪不会编程21 小时前
数据结构—排序算法篇二
数据结构·算法·排序算法
星释21 小时前
Rust 练习册 16:Trait 作为返回类型
java·网络·rust
2301_7965125221 小时前
Rust编程学习 - 如何理解Rust 语言提供了所有权、默认move 语义、借用、生命周期、内部可变性
java·学习·rust
乐悠小码21 小时前
Java设计模式精讲---03建造者模式
java·设计模式·建造者模式
一个人的幽默21 小时前
聊一下java获取客户的ip
java
披着羊皮不是狼21 小时前
Spring Boot——从零开始写一个接口:项目构建 + 分层实战
java·spring boot·后端·分层
ShineWinsu21 小时前
对于数据结构:堆的超详细保姆级解析—上
数据结构·c++·算法·计算机·二叉树·顺序表·
im_AMBER21 小时前
Leetcode 46
c语言·c++·笔记·学习·算法·leetcode
努力学算法的蒟蒻1 天前
day09(11.6)——leetcode面试经典150
算法·leetcode·职场和发展
2301_796512521 天前
Rust编程学习 - 内存分配机制,如何动态大小类型和 `Sized` trait
学习·算法·rust