題目描述:
給定一個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