快速幂

介绍

快速幂是一种计算底数的n次幂的方法,他将朴素的O(n)的时间复杂度缩短到O(logn),计算效率大大提升,减少循环次数,不至于做题超时.

算法核心

他将普通的累乘合并,利用二进制的特性将指数分半,底数平方,循环次数减少.
如:2^5

其指数5为十进制数,二进制为0101,将二进制写为十进制的计算方法是1 * 2^2 +1 * 2^0.
上面的计算就可以看成是0100 + 0001的结果,即1 * 2^2 +1 * 2^0.

依据上面分布相加特性我们是不是可以想到 底数a 每次乘以他本身,当二进制指数第一位遇到1时,便将a的值乘到定义的cnt变量当中,之后再去掉那一位(去掉的那一位已经被a自乘了),然后继续a自乘,二进制指数继续去掉最后一位,直至第一位再次出现1就再将a的值乘入cnt当中,最后指数削到最后为0时,就退出并输出cnt的值.

那么if判断条件怎么写呢?

这里就要用到&(我下面有讲) 这个位运算符了,通过指数&1,来对二进制指数的第一位进行判断是否为1.
理论结束,下面就是代码实现了.

代码

#include <stdio.h>

int fast_pow(int a, int b) {//自定义函数
	int cnt = 1;//创建cnt来乘入a的值
	while (b) {
		if (b & 1)//判断二进制指数的第一位是否为1
			cnt = cnt * a;
		a = a * a;
		b >>= 1;//这里是位运算,同(/2)的作用相同
	}
	return cnt;
}

int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	printf("%d", fast_pow(a, b));
	return 0;
}

代码很简单是吧ψ(`∇´)ψ

位操作符&

按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现.

例如:

5的二进制0101与3的二进制0011按位与,结果是0001,只有当相对应的位都为1时结果为1,否则为0,也就是与门.

扩展

快速幂常用于取模,如:
洛谷P1226
取模只要带入这个引理:积的取余等于取余的积的取余 就行,不过要注意更改数据类型.
知道了快速幂,你也可以想一下快速乘要如何实现呢?

这是本人的第一篇博客,希望在这里同大家一起进步,我很欢迎,也很感激大家能够来看我的小博客,希望我们共同在二进制海洋中畅游ψ(`∇´)ψ!感受编程带来的快感(。ò ∀ ó。)
随后我也会一直更新的,哪怕没人看ಥ_ಥ,希望以后我也能写出一些高质量文章让大家阅读!

posted @   帝宝单推人!  阅读(88)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示