快速幂
求一个数的幂次数,简单方法就是循环乘法,复杂度是O(n)。
使用快速幂可以做到O(logn)的复杂度。
考虑5^11,将11转为二进制1011,可知11=2^3+2^1+2^0;
那么,511 = 5(2^3+2^1+2^0) = 5(2^3)*5(2^1)*5(2^0);
只要求得二进制x位为1的5^(2^x)即可;
而5(2^x) = 5(2^(x-1+1)) = 5(2^(x-1)*2)= 5(2^(x-1)+2^(x-1)) = 5(2^(x-1))* 5(2^(x-1));
由此可知,设5(2^(x-1))为A(x-1),那么A(x) = A(x-1) * A(x-1);
循环除以二求解:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
class Solution { public: double Power(double base, int exponent) { int e = abs(exponent); double ans = 1; while(e) { if(e & 1) { ans *= base; } base *= base; e>>=1; } return exponent>=0?ans:1/ans; } };