前几天做练习时用到了幂的计算,我没用系统自带的pow,自己写了一下
int x = 5;
int y = 25;
int pow1(int x,int y){
int m = 1;
while(y--)
m*=x;
return m;
}
这种O(N)效率比较低,能不能把时间复杂度降低到O(logN)呢?
上网搜索了一下快速幂,答案很多,但是…你们这么相互复制真的好吗(╯°Д°)╯┻━┻
好吧,我自己试着写了一下,并整理了一下思路,记录在这里。
首先要介绍一下“>>”这个东西。
c语言程序中x>>=1,如果作用于整数x,就是把x右移一位,把x的二进制值的最后一位丢弃,最高位补0。
实际就是把x的值除以2。在运算结果上等价于x=x/2。
我们拿x^y来介绍快速幂算法。为了避免一个一个x相乘来得出结果,我们将y化为二进制。
比如6的二进制是110。即y=(2^2) *1 + (2^1) *1 + (2^0) *0
这时x^y就被转化为x^(2^2) * x^(2^1) ,而指数是可以很快算出来的。
代码如下
int getX();
int pow(int x,int y);
int x = 5;
int y = 25;
int getX(){
return pow(x,y);
}
int pow(int x,int y){
int m=1;
int base = y;
while(y!=0){
if(y&1) //y&1 同 y%2
m*=base;
base*=base;
y>>=1;
}
return m;
}