【LeetCode】43. 字符串相乘

本文详细解析了如何在不使用标准库大数类型的情况下,实现两个以字符串形式表示的非负整数的乘法运算。通过遍历字符串中的每个字符,将其转化为数字并进行乘法操作,再将结果转换回字符串形式,展示了算法的具体实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

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

示例 2:

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

说明:

  1. num1 和 num2 的长度小于110。
  2. num1 和 num2 只包含数字 0-9
  3. num1 和 num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

 

思路

每次从两个字符串中分别取一个字符进行乘法,i用来遍历第一个字符串,j用来遍历第二个字符串,位数为n1和位数为n2的数相乘的总位数最大为n1+n2,所以第i位和第j位的乘积的个位出现在最终字符串res的最后一位,即i+j+1。TakeOver存储进位,每一次小循环结束的位数i代表可能有进位的多于j位数的那一位,最后不要忘记将结果前面的0删除!

 

代码

class Solution {
public:
    string multiply(string num1, string num2) {
        int n1 = num1.size();
        int n2 = num2.size();
        string res(n1+n2,'0');
        int TakeOver = 0;
        for(int i=n1-1;i>=0;i--){
            TakeOver = 0;
            for(int j=n2-1;j>=0;j--){
                int m = (num1[i]-'0')*(num2[j]-'0');
                int sum = res[i+j+1] -'0' + m + TakeOver;
                res[i+j+1] = sum%10 + '0';
                TakeOver = sum/10;
            }
            res[i]+=TakeOver;
        }
        for(int i=0;i<n1+n2;i++){
            if(res[i]!='0')
                return res.substr(i);
        }
        return "0";
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值