快速幂

来源:互联网 发布:sql查询语句实例 编辑:程序博客网 时间:2024/05/24 23:13

快速幂

       快速幂顾名思义,就是快速计算某个数的多少次幂(即a的b次方)。一般的,我们通常采用连乘的方式求解此类问题,时间复杂度为O(N)。但是,当a,b都比较大时,如何快速的求出它的值呢?采用快速幂的方式可以将时间复杂度变成 O(log₂N)。

快速幂原理:(位操作)将指数b化为二进制后计算

例如:求a^15 

15化为二进制为1111,即15=2^3+2^2+2^1+2^0;

那么a^15=a^(2^3+2^2+2^1+2^0)=a^(2^3)*a^(2^2)*a^(2^1)*a^(2^0),

则求a^15值转化为求a^(2^3)*a^(2^2)*a^(2^1)*a^(2^0)的值。

而在位运算中,有两个运算恰好可以做到这些,b and 1(b&1就是取b的二进制最末位);b shr 1(b>>=1就是去掉b的二进制最末位)

      常规方法求a^b

#include<cstdio>#include<iostream>using namespace std;//常规方法计算a^blong long POW(long long a,long long b){    long long s=1;    while(b--)        s*=a;    return s;}int main(){    long long a,b;    scanf("%I64d%I64d",&a,&b);    printf("%I64d\n",POW(a,b));    return 0;}

      快速幂求a^b

#include<cstdio>#include<iostream>using namespace std;//快速幂求a^blong long POW(long long a,long long b){    long long r=1,base=a;    while(b!=0)    {        if(b&1)//取b的二进制末位            r*=base;        base*=base;        b>>=1;//去除b的二进制末位    }    return r;}int main(){    long long a,b;    scanf("%I64d%I64d",&a,&b);    printf("%I64d\n",POW(a,b));    return 0;}









0 0