题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
初看这道题,觉得很简单,但其实需要考虑多种情况:
- base为0时,结果为0;
- exponent < 0 ;exponent = 0; exponent >0三种情况下的计算。
方案1:
class Solution {
public:
double Power(double base, int exponent) {
double result = 1;
if(base == 0){
return 0.0000;
}
if(exponent > 0){
for(int i=1;i<=exponent;i++){
result = result*base;
}
}
else if(exponent == 0){
result = 1.00000;
}
else{
exponent = -exponent;
for(int i=1;i<=exponent;i++){
result = result*base;
}
result = 1.0/result;
}
return result;
}
};
运行时间:3ms
占用内存:460K
注意:机器中浮点数的比较是有误差的,因此double类型的比较,不能用简单的base==0来比较,一般的比较方式是,相减的差在一个很小的区间内,我们就认为是相等的。
即if(base == 0){
return 0.0000;
}
修改为:
if(base >= -0.000001 && base <= 0.00001){
return 0.0000;
}
方案2:根据指数的二进制表达,通过&1和>>1来逐位读取,为1时将该位代表的乘数累成到最终结果。
Eg:10 ^1101 = 10^0001 * 10^0100 *10^1000
class Solution {
public:
double Power(double base, int exponent) {
double result = 1;
int n;
if(base >= -0.000001 && base <= 0.000001){
return 0;
}
if(exponent == 0){
return 1.00000;
}
if( exponent >0){
n = exponent;
}
else{
n = -exponent;
}
while(n != 0){
if(n & 1 == 1){
result = result*base;
}
base = base*base;
n >>= 1;
}
return exponent>0? result:1/result; #注意该运算符的使用
}
};
运行时间:3ms
占用内存:480K
参考链接:
https://blog.csdn.net/qq_23217629/article/details/51729501
https://blog.csdn.net/u011514810/article/details/52754884?utm_source=blogxgwz5