原题链接点击这里
题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
AC代码:
public class Solution {
public double Power(double base, int exponent) {
int exp=0;
if(exponent>0) exp = exponent; //指数为正
else if(exponent<0) exp = -exponent; //指数为负
else{ //指数为0
if(base==0) //此时底数为0无意义
throw new RuntimeException("no sense");
else //任何数的0次为1
return (double)1;
}
double ans=1.0;
while(exp!=0){ //快速幂的思想
if((exp&1)==1){
ans = ans * base;
}
base *= base;
exp >>= 1;
}
return exponent>0?ans:(1/ans);
}
}
这里面有这几个注意点:
1. 要考虑到所有的情况。指数为正,为负,为0(当底数也为0时)的情况。
2. 用快速幂来优化。参考这个
将指数用二进制表示,以每个二进制位为幂累积相乘
比如要求
311
3
11
, 也即是求
311012
3
1101
2
,如下:
311⇒311012⇒320∗322∗323
3
11
⇒
3
1101
2
⇒
3
2
0
∗
3
2
2
∗
3
2
3
上面循环中,base依次是
320,322,323
3
2
0
,
3
2
2
,
3
2
3
,ans就是把它们乘起来。