【程序员面试金典】面试题 08.05. 递归乘法

该文介绍了如何使用递归和位运算符(不使用乘法*)来实现两个正整数的相乘。主要思路是通过A*(B/2)+A*(B%2)的方式,利用位左移和位右移优化计算,当B为偶数时只进行一次乘法,为奇数时进行两次。这种方法展示了在算法设计中对位操作的巧妙运用。
摘要由CSDN通过智能技术生成

【程序员面试金典】面试题 08.05. 递归乘法

题目描述

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

输入:A = 1, B = 10
 输出:10
输入:A = 3, B = 4
 输出:12

解题思路

思路1:最直观的想法是,位运算+降次递归。A*B的计算可以根据B是奇数还是偶数来分类:如果B是偶数,那么A*B=(A+A)*(B/2);如果B是奇数,那么A*B=(A+A)*(B/2)+A。其中A+A可以通过A<<1实现,B/2可以通过B>>1实现,B是奇数还是偶数可以通过B&1实现。

int multiply(int A, int B) 
{
    if(B==0) return 0;
    if(B==1) return A;
    int C=0;
    if(B&1)
       C=A;
    return multiply(A<<1,B>>1)+C;
}

总结:适当使用位运算可以加快速度提升效率!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值