递归乘法算法

文章目录

欢迎大家阅读我的博客,给生活加点impetus!!

让我们进入《题海探骊》,感受算法之美!!

递归乘法

题目链接

在线OJ

题目详解

这里需要注意保证整数乘法范围不会被溢出

解题思路:

有些人肯定就会直接写出A*B。

c 复制代码
int multiply(int A, int B) {
    return A*B;
}
//或者
int multiply(int A,int B)
{
	if(B==0)
	{
		return 0;
	}
	return A+multiply(A,B-1);
}

但是还有没有不使用乘法的方法呢?

有的,但是这个方法有点吃操作!!

乘法在现实中常见,十进制的乘法都会算,那二进制的乘法利用小学学的方法能不能够计算呢?我们来看一下

假如A=1101(二进制),B=1001(二进制)。

怎么算呢?我们把A*B展开,下来自己去实践一下。

这里直接来讲结论:

对于左移位操作,在二进制中实际是提升阶,比如1<<2=100=4,右移对应降低阶4>>1=10=2,和10进制中乘10和除10的作用一样。

我们来看一下左移和右移的原理

接下来我们就能够将例子这样改写:

代码实现:

c 复制代码
int multiply(int A, int B){
    if(B){//判断b是否为0
        //从0阶(A*(B&1)*2^0)开始,每次算当前阶(A*(B&1)*2^n)的乘法相加,直到B右移完全,即B为0。
        if(B&1){//如果B的最后一位是1
            //B就能够乘A上去,递归算B右移第2位,然后求和+(1*A=A)。
            return multiply(A<<1,B>>1)+A;
        }else{
            //B就不能够乘A上去,递归算B右移第2位,然后求和+(0*A=0)。
            return multiply(A<<1,B>>1);
        }
    }
    // B为0返回0
    return 0;
}

理解:

1:因为这个变量的调整是位移,2倍调整的,时间复杂度是logn

2:<< 1 是将 A 左移一位,相当于 A * 2>> 1 是将 B 右移一位,相当于 B / 2

3:左移一位相当于乘2

4:B&1主要是为了判断这个结尾是否为1 ,判断是否需要加A,递归的时候B右移,就能够取到B的所有位。

5:涉及位移,按位与,三目操作符号等操作,由十进制乘法联想到二进制乘法。

我们最后来看解法代码:

这里我们可以使用三目操作符:

一般形式为condition? expression1 : expression2。其中condition是一个布尔表达式 ,expression1和expression2是两个不同的表达式或值。
当condition为true时,整个表达式的值为expression1的值;当condition为false时,表达式的值为expression2的值。
直接返回return B?multiply(A<<1,B>>1)+(B&1?A:0):0;

结语

感谢大家阅读我的博客,不足之处欢迎指正,希望大家有更好的思路与我交流!!

前日父子万日锛-铁杵磨成针!!加油!!

相关推荐
Dovis(誓平步青云)33 分钟前
【数据结构】·励志大厂版(复习+刷题):二叉树
c语言·数据结构·经验分享·笔记·学习·算法·学习方法
越城34 分钟前
算法效率的钥匙:从大O看复杂度计算 —— C语言数据结构第一讲
c语言·开发语言·数据结构·算法
姜行运37 分钟前
数据结构【堆和链式结构】
数据结构·算法·c#
何其有幸.8 小时前
实验3-3 比较大小(PTA|C语言)
c语言·数据结构·算法
东阳马生架构9 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
老饼讲解-BP神经网络9 小时前
一篇入门之-评分卡变量分箱(卡方分箱、决策树分箱、KS分箱等)实操例子
算法·决策树·机器学习
何其有幸.10 小时前
实验6-3 使用函数求特殊a串数列和(PTA|C语言)
c语言·数据结构·算法
不会计算机的捞地10 小时前
【数据结构入门训练DAY-24】美国大选
数据结构·算法
明月看潮生10 小时前
青少年编程与数学 02-018 C++数据结构与算法 11课题、分治
c++·算法·青少年编程·编程与数学
Echo``10 小时前
2:QT联合HALCON编程—图像显示放大缩小
开发语言·c++·图像处理·qt·算法