LeetCode:面试题 08.05. 递归乘法

面试题 08.05. 递归乘法

题目要求:

递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。

解题思路:

思路1:直接将乘法分成多个n相加,比较直接暴力;

判断其中较小的数,然后将较大数data相加,一共加n个。

思路2:

1. 巧用位运算,二进制位中,两个相邻位之间差2^1;

2. 同样将两个数分成最大和最小;

3. 通过判断最低位是否为1,进行移位操作,将每次的移位加在一起。

例子:A = 9, B = 7; A x B = 9 x (2^2+2^1+2^0)=9<<2+9<<1+9;

 1 class Solution {
 2 public:
 3     int multiply(int A, int B) 
 4     {
 5         int num=0;
 6         return (A > B)? mult(B, A, num):mult(A, B, num);
 7     }
 8 
 9     int mult(int n, int data, int &num)
10     {
11         // if (n==1)
12         // {
13         //     num=num+data;
14         //     return num;
15         // }
16         // num=num+data;
17         // --n;
18         // mult(n, data, num);
19         // return num;
20         if(n== 0) return 0;
21         for (int i=0; n!=0; i++)
22         {
23             if (n&1)
24             {
25                 num += data<<i;  
26                 // data=data<<i;
27                 // num +=data;
28 } 29 n=n>>1; 30 } 31 return num; 32 } 33 };

猜你喜欢

转载自www.cnblogs.com/Tavi/p/12515942.html
今日推荐