题目:给定两个字符串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"; } };
原文:https://www.cnblogs.com/alderheart/p/10958615.html