【力扣】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);
    }
}
相关推荐
zjw_rp3 分钟前
Spring-AOP
java·后端·spring·spring-aop
Oneforlove_twoforjob16 分钟前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
向宇it33 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行35 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
清梦20201 小时前
经典问题---跳跃游戏II(贪心算法)
算法·游戏·贪心算法
Dream_Snowar1 小时前
速通Python 第四节——函数
开发语言·python·算法
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想2 小时前
JMeter 使用详解
java·jmeter
言、雲2 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库