注意/思路
- 保存 被乘数*[0…9]的结果备用,然后移位相加即可
- 乘数末尾是0
代码
9ms
class Solution {
public:
void ReverseStr(string& str){
int left=0, right = str.size()-1;
while(left<right){
char c = str[left];
str[left] = str[right];
str[right] = c;
left++;
right--;
}
}
void AddResult(string& result, const string& subProduct, const int shift){
int carry = 0;
while(result.size() < shift){
result += "0";
}
for(int i=shift; i<subProduct.size() + shift; i++){
if(i < result.size()){
int subSum = (result[i]-'0') + (subProduct[i-shift]-'0') + carry;
if(subSum >= 10){
subSum-= 10;
carry = 1;
} else {
carry = 0;
}
result[i] = subSum + '0';
} else {
int subSum = (subProduct[i-shift]-'0') + carry;
carry = subSum / 10;
subSum = subSum % 10;
result = result + (char)(subSum+'0');
}
}
if (carry > 0) {
result += (char)(carry + '0');
}
}
string getSubProduct(char digit, string op){
int carry = 0;
int d = digit-'0';
for(int i=0; i<op.size(); i++){
int prod = (op[i]-'0') * d + carry;
carry = prod / 10;
prod = prod % 10;
op[i] = '0' + prod;
}
if(carry > 0){
op = op + (char)(carry+'0');
}
return op;
}
string multiply(string op1, string op2) {
string result;
if(op1.empty() || op2.empty())
return result;
if(op1.size() < op2.size()){
string temp = op1;
op1 = op2;
op2 = temp;
}
string productSub[10];
ReverseStr(op1);
ReverseStr(op2);
for(int i=0; i<op2.size(); i++){
char digit = op2[i];
if(digit == '0')
continue;
if(productSub[digit-'0'].empty()){
productSub[digit-'0'] = getSubProduct(digit, op1);
}
AddResult(result, productSub[digit-'0'], i);
}
if(result.empty())
return "0";
ReverseStr(result);
return result;
}
};