要求对两个非负整数字符串进行乘法运算
解题过程
唯一的解法就是按照乘法规则,逐位相乘、累加、进位...
取巧整数乘法都将受到溢出制裁!
思路
回顾一下乘法规则:
- 个位数和另一个乘数运算,然后得出结果个位;
- 十位数和另一个乘数运算,与中的结果的下一位开始相加,得出结果十位;
- 依次
因此需要做的是:
- 单个数字与数字字符串乘法
- 两个数字字符串加法(上一轮结果移除最右边一位再加)
- 取出相加结果最后一位作为最终结果的相应位置
- 循环结束时取出相加结果的前
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;
}
};