算法练习-字符串乘法

53 阅读1分钟

要求对两个非负整数字符串进行乘法运算

解题过程

唯一的解法就是按照乘法规则,逐位相乘、累加、进位...

取巧整数乘法都将受到溢出制裁!

思路

回顾一下乘法规则:

  1. 个位数和另一个乘数运算,然后得出结果个位;
  2. 十位数和另一个乘数运算,与11中的结果的下一位开始相加,得出结果十位;
  3. 依次

因此需要做的是:

  • 单个数字与数字字符串乘法
  • 两个数字字符串加法(上一轮结果移除最右边一位再加)
  • 取出相加结果最后一位作为最终结果的相应位置
  • 循环结束时取出相加结果的前n-1位作为前缀

实现

class Solution {
public:
    void reverse(string& str) {
        int left = 0, right = str.size() - 1;
        while (left <= right) {
            char ch = str[right];
            str[right] = str[left];
            str[left] = ch;
            left++;
            right--;
        }
    }
    string add(string num1, string num2) {
        if (num1 == "0") {return num2;}
        if (num2 == "0") { return num1; }
        int i = num1.size() -1;
        int j = num2.size() -1;
        int carry = 0;
        string result;
        while ( i >= 0 || j >= 0 || carry) {
            int sum = carry;
            if (i >= 0) { sum += (num1[i] - '0'); i--; }
            if (j >= 0) { sum += (num2[j] - '0'); j--; }
            carry = sum/10;
            sum %= 10;
            result = result + std::to_string(sum);
        }
        this->reverse(result);
        return  result;
    }

    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0" ) { return "0"; }
        int i = num1.size() -1;
        string result;
        string layerLast = "0";
        string nextLayer;
        while ( i >= 0) {
            int j = num2.size() -1;
            int carry = 0;
            string layer;
            while (j >= 0 || carry) { 
                int sum = carry;
                if (j >= 0) {
                    sum += ((num1[i] - '0') * (num2[j] - '0'));
                }
                carry = sum/10;
                sum %= 10;
                layer = layer + std::to_string(sum);
                j--;
            }
            this->reverse(layer);
            nextLayer = this->add(layer, layerLast);
            result = result + nextLayer[nextLayer.size() -1];
            layerLast = string(nextLayer.begin(), nextLayer.begin() + nextLayer.size() -1);
            i--;
        }
        this->reverse(result);
        return string(nextLayer.begin(), nextLayer.begin() + nextLayer.size() -1) + result;
    }
};