Multiply String-Leetcode

本文介绍了一种处理任意精度大数相乘的方法,通过字符串形式表示大数,使用类似于传统手算乘法的算法实现两个大数的乘法运算。文章详细展示了如何通过嵌套循环来逐位相乘并累加,最终返回乘积结果。

Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.

这道题思路很简单,根据乘法的算法,嵌套循环。

class Solution {
public:
    string multiply(string num1, string num2) {
        string n1,n2;
        string sum(num1.size()+num2.size()+1,'0');
        int count=0;
        int n=0;
        //尽量让长度短的作为乘数
        if(num1.size()<num2.size()) {
            n1=num2;
            n2=num1;
        }else{
            n1=num1;
            n2=num2;
        }
        //颠倒字符串的字符顺序,使得循环的第一位作为低位
        reverse(n1.begin(),n1.end());
        reverse(n2.begin(),n2.end());
        for(int i=0;i<n2.size();i++){
            int k2=n2[i]-'0';
            count=0;
            for(int j=0;j<n1.size();j++){
                int k1=n1[j]-'0';
                int tmp=sum[i+j]-'0';
                int sum_cur=tmp+count+k2*k1;
                count=sum_cur/10;
                sum[i+j]=sum_cur%10+'0';
            }
            //每以一位乘数遍历完被乘数所有位数,此时若count不为0,则要将其加到sum的下一位里面
            sum[i+n1.size()]=count+'0';
        }
        //获得结果后,要将sum中字符的顺序颠倒过来,得到正确的数值顺序。
        reverse(sum.begin(),sum.end());
        //获取第一个不是0的索引,如果获取失败,则返回npos
        int p=sum.find_first_not_of('0');
        //字符串全都是0的情况,此时返回“0”
        if(sum.find_first_not_of('0')==string::npos)  return "0";
        //否则找到不是0的第一位,并利用substr函数复制子字符串,要求从指定位置开始,并具有指定的长度
        else return sum.substr(p,sum.size());
    }
};
### LeetCode Problem 43 的 C++ 实现 LeetCode 第 43 题名为 **Multiply Strings**,其目标是给定两个由非负整数组成的字符串 `num1` 和 `num2`,返回这两个数相乘的结果。需要注意的是,输入和输出都应该是字符串形式。 以下是该问题的一种高效实现方式: #### 解决方案描述 为了完成此任务,可以采用模拟手动计算的方法来处理大数乘法。具体来说,通过逐位相乘并记录每一位的结果,最终将这些结果组合起来形成完整的乘积[^5]。 下面是具体的 C++ 实现代码: ```cpp class Solution { public: string multiply(string num1, string num2) { if (num1 == "0" || num2 == "0") return "0"; // 特殊情况处理 int n = num1.size(), m = num2.size(); vector<int> res(n + m, 0); // 反向遍历两串数字进行逐位相乘 for (int i = n - 1; i >= 0; --i) { for (int j = m - 1; j >= 0; --j) { int mul = (num1[i] - '0') * (num2[j] - '0'); int sum = mul + res[i + j + 1]; res[i + j + 1] = sum % 10; res[i + j] += sum / 10; } } // 将结果转换为字符串 string result; for (auto digit : res) { if (!(result.empty() && digit == 0)) { // 去掉前导零 result.push_back(digit + '0'); } } return result.empty() ? "0" : result; } }; ``` #### 复杂度分析 - 时间复杂度:O(m × n),其中 \(m\) 是 `num1` 的长度,\(n\) 是 `num2` 的长度。这是因为我们需要对每一对字符执行一次乘法操作。 - 空间复杂度:O(m + n),用于存储中间结果以及最后的乘积[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值