算法入门——快速幂

快速幂

设想一下,如果求a^b,可以通过循环,但是当b很大时,会面临超时的问题,所以我们引入快速幂
给定一个a^b,通过将b以二进制形式拆分,按位取出。
任何一个十进制的b都可以变成二进制数
:b=9;转换成二进制为1001,在通过位运算(&1),判断二进制每一位是0是1

通过二进制运算(具有指数型递增的特点,所以能实现快速求一个数的n次幂)使其求出a^b;

位运算知识

& 运算符可以直接对二进制进行操作,1 & 1 = 11 & 0 =00 & 1 = 00 & 0 = 0

初版快速幂代码

int quick_pow(int a,int b)//实现快速幂的函数,计算a^b;
{
    int ans = 1;
    while(b){//当b!=0
        if(b&1)//如果b的二进制当前位数是1
        ans*=a;
        b>>=1;//将b的二进制形式向右移位
        a*=a;
    }
    return ans;
}

取模版快速幂代码

补充知识点
(a *b *c *d )%p = (((a *b)%p *c)%p *d)%p

//取模版快速幂代码
//如果在运算过程中long long也不能储存数据,或者求a^b的最后n位,使用取模版快速幂
long long quick_pow(long long a,long long b,long long p)
{
    int ans=1;
    while(b)
    {
        if(b&1)
        ans=(ans*a)%p;
        b>>=1;
        a=(a*a)%p;
    }
    return ans;
}

完整代码如下

#include <iostream>

using namespace std;
//快速幂代码
int quick_pow(int a,int b)//实现快速幂的函数,计算a^b;
{
    int ans = 1;
    while(b){//当b!=0
        if(b&1)//如果b的二进制当前位数是1
        ans*=a;
        b>>=1;//将b的二进制形式向右移位
        a*=a;
    }
    return ans;
}
//取模版快速幂代码
//如果在运算过程中long long也不能储存数据,或者求a^b的最后n位,使用取模版快速幂
long long quick_pow(long long a,long long b,long long p)
{
//和快速幂代码基本没区别
    int ans=1;
    while(b)
    {
        if(b&1)
        ans=(ans*a)%p;
        b>>=1;
        a=(a*a)%p;
    }
    return ans;
}
int main()
{
    int a=5,b=13;//以5^13次方为例
    int p=1000;
    cout<<quick_pow(a,b)<<endl;;
    cout<<quick_pow2(a,b,p)<<endl;;
    return 0;
}

如果有问题希望各位大佬指正,出自刚刚接触算法的小白。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值