【力扣】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);
    }
}
相关推荐
我变成萤火虫5 分钟前
河南萌新联赛2026第(四)场:南阳理工学院
数据结构·c++·算法·贪心算法·stl·动态规划
To_OC2 小时前
LC 239 滑动窗口最大值:从暴力超时到单调队列一遍过
javascript·算法·leetcode
2601_963870203 小时前
【计算机毕业设计】基于Spring Boot的专科医院医疗管理系统
java·spring boot·课程设计
Bingo_BIG3 小时前
Java Spring 批量修改,实体、接口、方法的定义
java·spring
.道阻且长.3 小时前
9.LeetCode算法习题讲解--滑动窗口--无重复字符的最长字串
算法·leetcode·职场和发展·哈希算法
画中有画3 小时前
软件架构中质量属性(性能、安全、可扩展性)的权衡设计
java·运维·安全
Shaoxi Zhang4 小时前
JAVA学习笔记035——对象和JSON格式
java·笔记·学习
赵丙双4 小时前
CountDownLatch 源码分析
java·aqs·countdownlatch
余额瞒着我当琳4 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
thefool1122664 小时前
翻转二叉树
java