快速幂 算法学习笔记

快速幂 学习笔记

概念与使用缘由

快速幂,顾名思义,就是用比一个一个相乘更快、更节约时间的求幂次的方法。
比如求24,如果把2乘4次,那么时间复杂度就是O(4),而如果用快速幂,时间复杂度会变成O(log24)即为O(2)。

两种方法

1.用位运算的方法

位运算原理

按位运算,就是把a^b中的b转化成二进制的形式,比如:
25 把5转化成二进制,即为2^(2 ^ 0+2 ^ 2) 也就是 21*24
相比之前的25 需要运算5次,用快速幂的方法就只运算了2次。

位运算所需要用到的运算符

>> :右移。 a>>b 功能是将运算的数字a的二进制数向右移b位。
右移b位就是除以2的b次方。
例如:b = 10>>2 那么>>运算是这样的 :
10 : 00001010
10>>2:00000010
b:00000010
故b为2。

& :按位与。a&b 功能是参与运算的两数各对应的二进位相与。
例如:z = 3 & 10 那么&运算是这样的 :
3 : 00000011
10:00001010
z : 00000010
故z为2。

主程序如下:
#include<stdio.h>
int main() {
	int a, b;
	scanf("%d %d", &a, &b);    //求a^b
	int ans=1;
    while(b!=0){
        if(b&1) {
		    ans*=a;
		}
        b>>=1;
        a*=a;
    }
    printf("%d\n",ans);
}

其中,这一串代码就是按位运算快速幂

	int ans=1;
    while(b!=0){
        if(b&1) {
		    ans*=a;
		}
        b>>=1;
        a*=a;
    }
程序解析

首先判断幂次b是否为0,当不是0的时候才进行位运算。
进行判断b&1的判断,若为真,则代表了此时的幂次b是奇数,而快速幂的位运算是建立在幂次是偶数的情况下进行的,所以我们用ans存储多乘的那一次,而后把b的二进制数向右移一位,即把ab 整体除以2的1次方,但是这样是不行的,所以我们把a *= a,相当于把a变成了a2,这样总体就不会改变了。
接下来的的运算过程,我们举211为例:
第1次循环:因为b是11,为奇数,所以
ans = 2;
211 = 45 * ans;

第2次循环:因为b是5,为奇数,所以
ans = 2 * 4 = 8;
211 = 162 * ans;

第3次循环:因为b是2,为偶数,所以
ans =8 ;
211 = 2561 * ans;

第4次循环:因为b是1,为奇数,所以
ans =8 * 256 = 2048 ;
211 = 655360 * ans;

此时,b==0,所以退出循环,输出结果ans。

综上,就是快速幂的位运算方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值