快速幂
一种快速求指数的方法
一般求a^b的做法,就是将a循环相乘b次时间复杂度为O(b),即O(n),快速幂可以将时间复杂度将为O(logn)
那它是如何做到的呢
以b = 11 为例
11 的 二进制 为 1011,即2^3*1+2^2*0+2^1*1+2^0*1,所以a^b = a^(2^3*1)*a^(2^2*0)*(2^1*1)*a*(2^0*1)①
这里引入两个位操作符
>> 移位操作 ,将运算数的二进制整体右移指定位数 例如 11 >> 1 ==> 1011 ==> 101 = 5
& 与操作符 b&1 取b二进制的最后一位 例如 11&1 ==> 1011 & 1 = 1
通过这两个操作符就可以获得b二进制上的数字
每有一个2进制数字就连乘a一次得到a^(2^n),若某一位二进制数字为1则将该项乘到结果上,最后就能得到①式
代码:
#include "stdafx.h"
#include <iostream>
typedef long long ret;
ret poww(int a, int b)
{
ret ans = 1L; ret base = a;
while (b!=0)
{
if (b & 1 != 0)
ans *= base;
base *= base;
b >>= 1;
}
return ans;
}
-----------------------------更新线----------------------------------------------
遇到leetcode上第50题后就感觉自己还是太天真
要考虑到int的范围……
double myPow(double x, int n) {
double ans = 1.00000, base = x;
if (n == 0) return ans;
unsigned int m;
if (n < 0)
m = -n;
else
m = n;
if (ans == x) return ans;
while (m != 0){
if (m & 1)
ans *= base;
base *= base;
m >>= 1;
}
return n > 0 ? ans : 1.0/ans;
}