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;
}
};