1. 题目
递归乘法。 写一个递归函数,不使用 *
运算符, 实现两个正整数
的相乘。
可以使用加号、减号、位移,但要吝啬一些。
示例1:输入:A = 1, B = 10输出:10示例2:输入:A = 3, B = 4输出:12提示:
保证乘法范围不会溢出
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recursive-mulitply-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 右移1位 == 除以2
- 左移1位 == 乘以2
2.1 递归
class Solution {
public:int multiply(int A, int B) {if(A < B)A^=B^=A^=B;//swap大的在前,少递归几次if(B==1)return A;if((B&1)==0)//B是偶数return multiply(A,B>>1)<<1;elsereturn A + (multiply(A,B>>1)<<1);}
};
2.2 循环
class Solution {
public:int multiply(int A, int B) {int i = 0, ans = 0;if(A < B)A^=B^=A^=B;//swap大的在前while(B)//把B分解成2进制数,对每一位乘以A{if((B&1)==1)//该位为1(1,2,4,8,16)ans += A<<i;//移动0,1,2,3,4位B >>= 1;//B的每位移到最右 & 1来判断i++;}return ans;}
};