程序员面试经典之递归乘法(C++/Java双重实现)

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

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/106696585
今日推荐