0
点赞
收藏
分享

微信扫一扫

LeetCode 43. 字符串相乘*

梦想家们 2022-03-11 阅读 46

基本思路:

大数运算问题,注意一下竖式优化:

重点是:
1.先保存,后续整体进位加和;
2.c[i+j+1]=a[i]+a[j];
3.乘法结果位数最大为m+n;
在这里插入图片描述

具体代码:

未优化版本:

class Solution {
public:
    string add(string a, string b) {
        string ret = "";
        int carry = 0;
        int l1 = a.size()-1, l2 = b.size()-1;
        while (l1>=0||l2>=0) {
            int x = 0, y = 0;
            if (l1 >= 0) 
                x = a[l1--] - '0';
            if (l2 >= 0) {
                y = b[l2--] - '0';
            }
            int sum = x + y + carry;
            ret = char('0' + (sum % 10)) + ret;
            carry=sum/10;
        }
        if (carry != 0)
            ret = '1' + ret;
        return ret;
    }

    string multi(string a, int b, int index) {
        string ret = "";
        int carry = 0;
        int l = a.size() - 1;
        while (l>= 0) {
            int x = a[l--] - '0';
            int res = x * b + carry;
            ret = char(res % 10 + '0') + ret;
            carry=res/10;
        }
        while (carry != 0) {
            ret = char(carry % 10 + '0') + ret;
            carry /= 10;
        }
        while (index > 0) {
            ret += '0';
            index--;
        }
        return ret;
    }

    string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")
            return "0";
        string ret = "";
        for (int i = num2.size()-1; i >= 0; i--) {
            int b = num2[i] - '0';
            string temp = multi(num1, b, num2.size() - 1 - i);
            ret = add(temp, ret);
        }
        return ret;
    }
};

优化版本:

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")
            return "0";
        int m = num1.size();
        int n = num2.size();
        vector<int>ret(m + n, 0);
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ret[i + j + 1] += int(num1[i] - '0') * int(num2[j] - '0');
            }
        }
        int carry = 0;
        string s = "";
        for (int i = m + n - 1; i >= 0; i--) {
            int sum = ret[i] + carry;
            s = char('0'+sum%10) + s;
            carry = sum / 10;
        }
        if (s.size() != 0 && s[0] == '0')
            s.erase(s.begin());
        return s;
    }
};
举报

相关推荐

0 条评论