递归乘法
递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
方法一:乘法转加法
A*B 可转化为 B 个 A相加,为了减少加法的运算,选择较大的数进行相加,例如:
9 * 3 = 9 + 9 * 2
= 9 + 9 + 9 * 1
class Solution {
public int multiply(int A, int B) {
int temp;
if (A < B){
temp = A;
A = B;
B = temp;
}
if (B > 0){
return multiply(A, B - 1) + A;
}
return 0;
}
}
方法二:利用位运算
位运算左移一位相当于*2,右移一位相当于/2, 可代替乘法,选择其中较小的数min看包含多少个2,如果为奇数可当做(min - 1)* max + max,例如
3 * 9 = 1 * 9 * 2 + 9
4 * 9 = 2 * (9 * 2)= 1 * (9 * 2) * 2
class Solution {
public int multiply(int A, int B) {
int min = Math.min(A, B);
int max = Math.max(A, B);
int res;
if (min < 1){
return 0;
}
if ((min & 1) == 1){
res = multiply(min>>1, max<<1) + max;
}else{
res = multiply(min>>1, max<<1);
}
return res;
}
}
方法三:快速幂
将其中较小的数min转化为二进制数,即为2的幂的和,分别与max相乘,例如
6 * 11 = 6 * (8 + 2 + 1)= 6 << 3 + 6 << 1 + 6 << 0
class Solution {
public int multiply(int A, int B) {
int min = Math.min(A, B);
int max = Math.max(A, B);
int res = 0;
for (int i = 0; min > 0; i++){
if ((min & 1) == 1){
res += (max << i);
}
min >>= 1;
}
return res;
}
}
快速幂用递归的方式为
class Solution {
int res = 0;
public int multiply(int A, int B) {
int min = Math.min(A, B);
int max = Math.max(A, B);
mul(min, max, 0);
return res;
}
public void mul(int min,int max,int i){
if((min >> i) == 0) {
return;
}
if(((min >> i) & 1) == 1){
res += (max << i);
}
mul(min, max, i + 1);
}
}