[LeetCode]43 高精度乘法

Multiply Strings(高精度乘法)

【难度:Medium】
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.
实现高精度非负整数乘法。


解题思路

按照常规解法,用字符串操作来模拟乘法的步骤可以先实现字符串高精度加法,再将加法运用到乘法过程中。这种方法简单但是耗时比较大,这里介绍一种比较巧妙的方法,借鉴LeetCode上的一份高票代码。
这里写图片描述
观看上图,它描述的是我们计算乘法的过程。仔细分析可以发现,对于原来在上面字符串中下标为1的“2”和在下面字符串中下标为0的“4”的相乘结果08出现在了最后的乘法结果字符串的下标1和2处。这一结果对其他下标的数字同样成立:下标i和下标j相乘的高位结果位于下标i+j处,低位位于下标i+j+1处。根据这个结果,实现高精度的乘法就变得简单了。


c++代码如下:

//高票代码版本
class Solution {
public:
    string multiply(string num1, string num2) {
        int m = num1.size();
        int n = num2.size();
        vector<int> array(m+n);
        string ans = "";
        for (int i = m-1; i >= 0; i--) {
            for (int j = n-1; j >= 0; j--) {
                int index1 = i + j;
                int index2 = i + j + 1;
                int sum = (num1[i]-'0')*(num2[j]-'0')+array[index2];
                array[index1] += sum / 10;
                array[index2] = sum % 10;
            }
        }

        for (auto v:array) {
            if (ans.size() != 0 || v != 0)
                ans  += to_string(v);
        }

        return ans.size() == 0?"0":ans;
    }
};
//简单但低效版本
class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1.empty())
            return num2;
        if (num2.empty())
            return num1;
        if (num1.size() == 1 && num1[0] == '0')
            return "0";
        if (num2.size() == 1 && num2[0] == '0')
            return "0";

        string ans = "";
        int count = -1;
        for (int i = num1.size()-1;i >= 0; i--) {
            string tmp = "";
            int carry = 0;
            count++;
            for (int j = num2.size()-1; j >= 0; j--) {
                int m = (num1[i]-'0')*(num2[j]-'0')+carry;
                carry = m / 10;
                tmp = to_string(m%10)+tmp;
            }
            if (carry)
                tmp = to_string(carry)+tmp;
            int count_tmp = count;
            while (count_tmp) {
                tmp = tmp + "0";
                count_tmp--;
            }

            ans = add(ans,tmp);
        }
        return ans;
    }
    string add(string num1, string num2) {
        if(num1.empty())
            return num2;
        if (num2.empty())
            return num1;

        int carry = 0;
        int i = num1.size()-1;
        int j = num2.size()-1;
        string ans = "";

        while (i >= 0 && j >= 0) {
            int m = (num1[i]-'0')+(num2[j]-'0')+carry;
            carry = m / 10;
            ans = to_string(m%10) + ans;
            i--;
            j--;
        }
        while (i >= 0) {
            int m = (num1[i]-'0')+carry;
            carry = m / 10;
            ans = to_string(m%10) + ans;
            i--;
        }
        while (j >= 0) {
            int m = (num2[j]-'0')+carry;
            carry = m / 10;
            ans = to_string(m%10) + ans;
            j--;
        }
        if (carry)
            ans = to_string(carry)+ans;
        return ans;
    }
};

你可能感兴趣的:(LeetCode)