整数快速幂

来源:互联网 发布:美工摄影师招聘 编辑:程序博客网 时间:2024/05/29 08:37

快速幂

简介

快速幂的目的就是做到快速求幂,假设我们要求 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;......
快速幂的代码很短很好用,也能减少不少的代码运行时间,所以,再遇见与求幂有关的题目是就优先考虑用快速幂吧

原创粉丝点击