LeetCode 41字符串相乘
解题思路:
- 本题要求两个字符串数字相乘,显然是个大数乘法的题,结果用一个int类型数组表示。
- 首先判断特殊情况,既某一个数字为0。如果出现,直接返回字符串 “0”
- 如果结果非0,则将两个字符串翻转,这是因为要按照人类的思维习惯进行乘法,既从个位开始,如果不反转,第一位取的不是个位,而是最高位。
- 翻转之后,采用惰性存储法,我们不考虑进位问题,等到后面合并的时候统一考虑进位,现在仅仅将每个乘法的结果错位相乘,那么怎么错位相乘呢?
(1) . 首先,定义一个index索引,记录当前相乘的结果应该从哪里开始相加,因为是错位,所以要从当前的 i 开始累加,直接相加就行,不用考虑进位问题 - 最后每个results数组里应该保存了每一位对应的结果,然后我们开始考虑进位问题。
(1) . 定义一个变量 cal_next 初始值设为0,用来记录本次到下一数字的进位。
(2) . 将本次的值直接于cal_next相加,将结果除10 用来计算下一次cal_next的值
(3) . 再将results中当前的值%10,将当前的位置的值替换掉 - 现在开始将字符串进行合并,一定要注意,是从尾巴向前合并,在合并当中,最重要的就是头部去0,由于不知道最后结果长度是多少,所以直接定义最大长度str_len = num1.length() + num2.length()然后再合并的步骤中,增加判断
i==0 && results[str_len-i-1] == 0
用来判断头部是否为0
源代码:
class Solution {
private:
int results[250] = {0};
public:
string multiply(string num1, string num2) {
int i,j,index = 0;
int mul1,mul2;
string Results = "";
if((num1.length() == 1 && num1[0] - '0' == 0) || (num2.length() == 1 && num2[0] - '0' == 0)){
return "0";
}
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
for(i=0;i<num1.length();i++){
index = i;
mul1 = num1[i] - '0';
for(j=0;j<num2.length();j++){
mul2 = num2[j] - '0';
results[index] += (mul1*mul2);
index ++;
}
}
int str_len = num1.length() + num2.length(),real_len = 0;
int cal_next = 0;
for(i=0;i<str_len;i++){
real_len ++ ;
results[i] += cal_next;
cal_next = results[i] / 10;
results[i] = results[i] % 10;
}
char currentStr;
for(i=0;i<real_len;i++){
if(i==0 && results[real_len-i-1] == 0){
continue;
}
char currentStr = results[real_len-i-1] + '0';
Results += currentStr;
}
return Results;
}
};