1.问题描述
递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
示例1:
输入:A = 1, B = 10
输出:10
示例2:
输入:A = 3, B = 4
输出:12
提示:
保证乘法范围不会溢出
2.问题分析
本题可以采取两种做法,一个是递归,一个是位运算
递归:比如3*4就相当于3个4相加,利用这个性质来解题
位运算:注意下面两个通式
1<<n
=2n
n<<1
=2n
那么解题的思路是:把其中一个数乘以其另一个数的二进制的每一项
比如3*5
,5用二进制就是101
,那么就是3*5
=3 * 1 * 20+3 * 0 * 21+ 3 * 1 * 22
3.递归做法
C++代码:
int multiply(int A, int B){
if(B==0)
return 0;
return A+multiply(A,B-1);
}
Java代码:
int multiply(int A, int B)
{
if(B==0)
return 0;
return A+multiply(A,B-1);
}
4.位移做法
C++代码:
int multiply(int A, int B) {
int res = 0;
for(int i=0;i<32;i++)//int是32位所以我们遍历32位
if(B&(1<<i))//判断B的各个位置是否为1
res += A<<i;
return res;
}
Java代码:
public int multiply(int A, int B) {
int res = 0;
for(int i=0;i<32;i++)
if(B&(1<<i))
res += A<<i;
return res;
}