链接:
https://www.nowcoder.com/questionTerminal/1a834e5e3e1a4b7ba251417554e07c00
来源:牛客网
来源:牛客网
/**
* 1.全面考察指数的正负、底数是否为零等情况。
* 2.写出指数的二进制表达,例如13表达为二进制1101。
* 3.举例:10^1101 = 10^0001*10^0100*10^1000。
* 4.通过&1和>>1来逐位读取1101,为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);
}
分析,实际上是把exponent按成二进制的形式进行表示,例如5=101.进中每一位的因子分别的base*2^2+0+base*2^0.利用&1操作可以判断整数二进制表现形式的最后一位是否为1。