递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
示例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;
}
};