题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
使用连乘的方法得到的时间复杂度 是 n.
这样是找不到工作的。
需要对他就行优化。
就是
次幂 exponent 不是奇数就是偶数,
当它是偶数时,如求 10^10, 就是10^8*10^2 也就是10^ 1000 *10^0010
当它是奇数时,如求10^11,就是10^8 * 10^2 * 10^ 也就是
10^ 1000 *10^0010*10^0001
我们可以发现次幂可以用二进制表示,像 二进制8421(1111)每一位之间是就翻倍的关系,这样前面求的幂乘以自己就相当于二进制的左移一位。
(对于exponent)最后通过&1获取当前位的状态 ,>>获取下一位的状态.
当前状态为1说明改为有效,乘到结果中
public double Power(double base, int n) {
double res = 1,curr = base;
int exponent;
if(n>0){
exponent = n;
}else if(n<0){
if(base==0)
throw new RuntimeException("分母不能为0");
exponent = -n;
}else{// n==0
return 1;// 0的0次方
}
while(exponent!=0){
if((exponent&1)==1)
res*=curr;
curr*=curr;// 翻倍
exponent>>=1;// 右移一位
}
return n>=0?res:(1/res);
}