牛客oj:數值的整數次方牛客oj九度oj:
github**: 011-數值的整數次方
csdn題解:劍指offer–011-數值的整數次方
九度oj
csdn題解
github**
數值的整數次方
1514-數值的整數次方
劍指offer–011-數值的整數次方
011-數值的整數次方
您也可以選擇回到目錄-劍指offer–題集目錄索引
題目描述
給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
class solution
return res;
}};
貌似我們已經完美的解決了問題,但是真的這樣麼?
我們輸入乙個指數為負數的情況
solution solu;
cout
<2, -3) 《可見我們的演算法是多麼的自以為是啊?
前面所說的指數為負數只是邊界的一種情況,學習演算法,必須全面了解所有的邊界
指數冪的所有邊界包括
#include
#include
using
namespace
std;
// 除錯開關
#define __tmain main
#ifdef __tmain
#define debug cout
#else
#define debug 0 && cout
#endif // __tmain
class solution
// 指數為負數的情況下,底數不能為0
if(equal(base, 0.0) == true && exponent < 0)
double res = 1.0;
if(exponent > 0.0)
else
return res;
}private :
double powernormal(double base, int exponent)
return res;
}double equal(double left, double right)
else
}};int __tmain( )
那麼還有沒有更加快速的辦法呢?
別急,我們慢慢來分析
寫出指數的二進位制表達,例如13表達為二進位制1101。
舉例:10^1101 = 10^0001*10^0100*10^1000。
通過&1和》1來逐位讀取1101,為1時將該位代表的乘數累乘到最終結果。
簡單明瞭,看來結果根指數中1的個數和位置有關係,那麼就簡單了,還記得劍指offer–010-二進位制中1的個數
double powernormal(double base, int exponent)
else
if(exponent == 1)
int res = 1, temp = base;
while(exponent != 0)
// 移位後, curr需要翻倍, 這樣到下個
temp *= temp; // 翻倍
exponent >>= 1; // 右移一位
}return res;
}
當然也可以用遞迴的寫法
double powernormal(double base, int exponent)
else
if(exponent == 1)
double res = powernormal(base, exponent >> 1);
res *= res;
if((exponent & 1) == 1)
return res;
}
「` 劍指offer 數值的整數次方
1 題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。2 思路 需要考慮到的情況 1 指數為負數的時候,可以先對指數求絕對值,算出次方之後的結果再取倒數。2 當底數是0,指數是負數的時候,可以將無效變數設定為true,並返回0。3...
劍指offer 數值的整數次方
給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。將指數大於0,小於0,等於0 底數不為0 的情況分開。其實指數為0的情況不必單獨拎出來 不進入if直接返回result為1.0 真正需要考慮的是,底數為0而指數為負的情況,數學上沒有意義。書...
劍指offer 數值的整數次方
給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。1.最直觀的方法,遞迴求解a b a a b 1 當然也可以用迴圈實現。要注意特殊情況,指數為0時乘方結果都是1 指數為負數時的計算,可以先轉化為正數再求倒數,但是底數為0時不能求導。2.效...