力扣-打卡题-2020-8-13

字符串相乘

题目链接

https://leetcode-cn.com/problems/multiply-strings/

思路

借鉴

https://leetcode-cn.com/problems/multiply-strings/solution/si-lu-qing-xi-by-lllllliuji-2/

  1. 把两个数用数组 a, b 来存储,并且反转(从个位开始乘)

  2. 对于 a 的第 i 位 和 b 的第 j 位相乘的结果存储在 c[i + j] 上,即 c[i + j] += a[i] * b[j];
    这里用加号是因为有多种情况都会映射到 i + j 位上。

  3. 最后,从 c 的低位向高位整理,c[i + 1] = c[i] / 10, c[i] %= 10;
    一个整理样例:

                         1   2   3
                     乘  4   5   6
                 ————————————————————
                         6   12  18
                     5   10  15
                 4   8   12
                 ————————————————————
                 4   13  28  27  18
                 整理: c[i + 1] += c[i] / 10, c[i] %= 10, 从低位开始。
                 step 0: 4   13  28  27  18
                 step 1: 4   13  28  28  8
                 step 2: 4   13  30  8   8
                 step 3: 4   16  0   8   8
                 step 4: 5   6   0   8   8
    

Python实现

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        
        a = list(num1)
        b = list(num2)
        asize = len(a)-1
        bsize = len(b)-1
        ans = ''
        c = list([0]*(asize+bsize+1))
        if num1 == "0" or num2 =="0":
            ans = "0"
            return ans
        else:
            for i in range(bsize,-1,-1):
                for j in range(asize,-1,-1):
                    c[i+j] += int(a[j])*int(b[i])
            for i in range(len(c)-1,0,-1):
                c[i-1] += int(c[i]/10)
                c[i] = c[i]%10
                print(c)
            for i in range(len(c)):
                ans +=str(c[i])
            return ans

C++实现

class Solution {
public:
    string multiply(string num1, string num2) {
        string ans;
        vector<int> a, b, c;
        c.resize(num1.size() + num2.size() - 1);
        for (int i = num1.size() - 1; i >= 0; i--) a.push_back(num1[i] - '0');
        for (int i = num2.size() - 1; i >= 0; i--) b.push_back(num2[i] - '0');
        for (int i = 0; i < a.size(); i++) {
            for (int j = 0; j < b.size(); j++) {
                c[i + j] += a[i] * b[j];
            }
        }
        int k = 0;
        for (int i = 0; i < c.size(); i++) {
            k += c[i];
            char c = k % 10 + '0';
            ans = c + ans;
            k /= 10;
        }
        while (k) {
            char c = k % 10 + '0';
            ans = c + ans;
            k /= 10;
        }
        while (ans.size() > 1 && ans[0] == '0') ans.erase(ans.begin());
        return ans;
    }
};

作者:lllllliuji-2
链接:https://leetcode-cn.com/problems/multiply-strings/solution/si-lu-qing-xi-by-lllllliuji-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值