劍指offer:數值的整數次方
阿新 • • 發佈:2021-02-18
技術標籤:演算法
文章目錄
題目描述
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
保證base和exponent不同時為0
思路及程式碼
方法一:暴力方法
很顯然就是n個b相乘。迴圈n次。
class Solution {
public:
double Power(double base, int exponent) {
if(exponent == 0)
return 1;
if (exponent<0){
base = 1/base;
exponent = -exponent;
}
double res = base;
while(exponent>1){
exponent--;
base = base * res;
}
return base;
}
};
方法二:遞迴法(快速冪)
class Solution {
public:
double recursion(double b,int n){
if(n==0)
return 1.0;
double ret = recursion(b,n/2);
// n&1判斷為1就是奇數,因為奇數的二進位制最後一位永遠都是1
if(n&1){
return ret*ret*b;
}
else{
return ret*ret;
}
}
double Power(double base, int exponent) {
if(exponent<0){
base = 1 / base;
exponent = -exponent;
}
return recursion(base,exponent);
}
};
方法三:非遞迴的快速冪
class Solution {
public:
double Power(double b, int n) {
if (n < 0) {
b = 1 / b;
n = -n;
}
double x = b; // 記錄x^0, x^1, x^2 ...
double ret = 1.0;
while (n) {
if (n&1) {
ret *= x; // 二進位制位數是1的,乘進答案。
}
x *= x;
// 算術右移一位;比如3(11)右移一位變成1(1)
n >>= 1;
}
return ret;
}
};