【力扣】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);
    }
}
相关推荐
naruto_lnq5 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq5 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
qq_297574675 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
老毛肚5 小时前
MyBatis插件原理及Spring集成
java·spring·mybatis
学嵌入式的小杨同学5 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
lang201509286 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
Re.不晚6 小时前
Java入门17——异常
java·开发语言
爱吃rabbit的mq6 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
缘空如是6 小时前
基础工具包之JSON 工厂类
java·json·json切换
追逐梦想的张小年6 小时前
JUC编程04
java·idea