遞歸乘法。 寫一個遞歸函數,不使用 * 運算符, 實現兩個正整數的相乘。可以使用加號、減號、位移,但要吝嗇一些。
示例1:
輸入:A = 1, B = 10
輸出:10
示例2:輸入:A = 3, B = 4
輸出:12
提示:保證乘法範圍不會溢出
思路
因爲乘法可以分解成加法,所以可以遞歸求和
class Solution {
public:
int mul(int a, int b){
// 如果b小於2,直接返回a,否則遞歸求和
return b< 2? a: (a+= mul(a, b- 1));
}
int multiply(int A, int B) {
// 如果A和B中有一個爲0,返回0
if(A== 0|| B== 0) return 0;
// 讓B取較小的可以減少運算
if(A< B) swap(A, B);
return mul(A, B);
}
};
參考了Leetcode題解中其中一個解法,
可以理解成模擬了二進制中的乘法運算
class Solution {
public:
int multiply(int A, int B) {
// 讓B取較小的可以減少運算
if(A< B) swap(A, B);
int result= 0;
// 模擬二進制位運算乘法
for(int i= 0; B!= 0; ++i){
if((B& 1)== 1)
result+= (A<<i);
B>>= 1;
}
return result;
}
};