整数快速幂

本文介绍了一种高效计算幂运算的方法——快速幂算法。通过将指数转换为二进制表示,并利用位运算,快速幂能够将时间复杂度从O(n)降低至O(logn)。文章详细解释了算法原理及实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速幂

简介

快速幂的目的就是做到快速求幂,假设我们要求 a^b ,按照平时的算法就是把a连乘b次,这样一来时间复杂度是O(b)也即是O(n)级别,快速幂能做到O(logn),快了好多好多
它的原理如下:
假设我们要求 a^b ,那么其实b是可以拆成二进制的,该二进制数第i位的权为 2^(i-1) ,例如当 b=11 时,11的二进制为 101111=2³×1+2²×0+2¹×1+2º×1a^x*a^y=a^(x+y) ,所以 a^11=a^(2^0+2^1+2^3)=a^(2^0)*a^(2^1)*a^(2^3)
因为用到了二进制,所以要用到 &>> 运算符, & 运算用于二进制取位操作,例如 a&1 的结果就是取a的二进制的末位,还可以用来判断奇偶 x&1=0 为偶, x&1=1 为奇; >> 运算是去掉二进制的末位

代码
int poww(int a,int b)
{
    int ans=1,res=a;
    while(b!=0)
    {
        if(b&1!=0)ans*=res;
        res*=res;
        b>>=1;///相当于b=b>>1
    }
    return ans;
}

代码详解

代码很短,就对于当 b=11 时来说, a^11 = a^(2^0+2^1+2^3) = a^(2^0)*a^(2^1)*a^(2^3) = a^1*a^2*a^8 ,相当于二进制的哪一位为1,就需要乘以a的该位的权重次幂,11的二进制为 1011 ,第1,2,4位为1,他们对应应该为 a^0,a^2,a^8 ,代码中的 if(b&1!=0)ans*=res; 就是将二进制为1的位a的对应次幂,乘到结果上, res*=res; 二进制每进一位,该位对应的幂翻倍,就相当于该位a的对应次幂的结果平方,简明的说,就是让 res 的值为 a^0;a^2;a^4;a^8;a^16;......
快速幂的代码很短很好用,也能减少不少的代码运行时间,所以,再遇见与求幂有关的题目是就优先考虑用快速幂吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值