大整数乘法(字符串乘法)

题目:给定两个字符串s1和s2,返回它们代表的正整数的乘积(也用字符串表示),不能把字符串转成整数类型再操作。

解法:手动模拟乘法。假设第一个字符串有n1位,第二个有n2位,则乘积位数不会超过(n1+n2)位,因此可以先将结果字符串res设置为(n1+n2)个0。对s2的每一位,和s1的每一位依次做乘法再相加。乘积模10就是需要放在那一位的数字。在生成res时,需要和当前res该位的数字进行加法运算(如一开始时就是0),因此进位是当前乘积整除10加上这个加法运算的和整除10。在对s2的每一位操作结束后,最后一个进位还没有加上去,因此需要手动把进位加到前面一位去。循环下去可以得到乘积。

class Solution {
public:
    string multiply(string num1, string num2) {
        int l1 = num1.length();
        int l2 = num2.length();
        if (num1 == "0" || num2 == "0")
            return "0";
        string res(l1 + l2, '0');
        for (int i = l1 - 1; i >= 0; i--)
        {
            int step = 0;
            for (int j = l2 - 1; j >= 0; j--)
            {
                int mul = (num1[i] - '0') * (num2[j] - '0');
                int sum = res[i+j+1] - '0' + step + mul % 10;
                res[i+j+1] = sum % 10 + '0';
                step = sum / 10 + mul / 10;
            }
            res[i] += step;
        }
        for (int i = 0; i < l1 + l2; i++)
        {
            if (res[i] != '0')
                return res.substr(i);
        }
        return "0";
    }
};

猜你喜欢

转载自www.cnblogs.com/alderheart/p/10958615.html
今日推荐