C++:快速幂Ⅰ

算法介绍:

在写代码的时候,我们经常会遇到幂运算,在实现a^{b}的时候我们往往是这样写的:

int pow(int a,int b)
{
    int ans=1;
    while(b--)
    {
        ans*= a;
    }
    return ans;
}

从时间复杂度上分析这个算法的复杂度是O(n)级别,当数量很大时,就会TLE

快速幂即为快速求出一个数的幂,这样可以避免TLE(超时)的错误。其时间复杂度为 O(log₂N),与普通的O(N)相比效率有了极大的提高。

核心思想:

假设我们要求a^n,n为正整数(对于负整数次幂,先求正整数次幂再取倒数就行)。我们以n = 13为例,将n表示为2二进制:

那么:

可见,我们只要观察 n 的每一位,如果第 i 位为1,就乘上 a^{2^{i}}(这个值可以在循环中得到)。

代码实现:

int quickPower(int x,int y)
{
    int b=x,ans=1;
    while(y!=0)
    {
        int a=y%2;
        if(a==1) ans*=b;
        if(a==0) ans*=1;
        b=b*b; 
        y=y/2;
    }
    return ans;
}

int quickPower(int a, int b)
{
    int ans=1,base=a; 
    while(b>0)
    {
        if(b&1) ans*=base; //如果b的二进制表示下是1
        base*=base; //把base变为a的2次方的(n+1)次方
        b>>=1; //删掉二进制b的最后一位数
    }
    return ans;
}

~菜就多练~洛谷P1226 【模板】快速幂

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值