劍指offer 12 數值的整數次方
阿新 • • 發佈:2019-01-02
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
本題兩個地方需要注意
1、對數字的預處理,比如,0的負數次方等
2、提高計算n的m次方的效率
對於第一點,注意,如果是 base==0 && exponent<0 則返回0.0,如果exponent是負數則先計算result = pow(base, -exponent)再返回1/result即可
對於第二點,下面提供兩種方法
方法一:遞迴。。。利用公式 ab=(b%2==0)?ab/2*ab/2:a(b-1)/2*a(b-1)/2*a
class Solution {
public:
double power(double base, int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
// 右移操作相當於除以二
double result = power(base, exponent>>1);
result*=result;
// x&0x1==1判斷如果是奇數
if(exponent & 0x1==1)result*=base;
return result;
}
double Power(double base, int exponent) {
if((base==0.0) && exponent<0)
{
// 底數為0且指數小於零則可能出現0為分母的情況
return 0.0;
}
int absExponent = exponent;
if(exponent<0) absExponent = -exponent;
double result = power(base, absExponent);
if (exponent<0) return 1.0/result;
return result;
}
};
方法二,利用分解冪的方法:
35中,5=(0101)2,也就是說:
35=30001*30100 也就是說,可以逐個求出3t(t為二進位制分解的結果,都是2k,就是說,35=31*34)如果該exp的二進位制第n位為1,那麼將這一位累乘進結果中,否則,不累乘。程式碼如下
class Solution {
public:
double power(double base, int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result=1;
while(exponent){
// 判斷最後一個二進位制位是否為1
if((exponent&1) == 1){
result*=base;
}
// 計算base的n次方
base*=base;
exponent>>=1;
}
return result;
}
double Power(double base, int exponent) {
if((base==0.0) && exponent<0)
{
// 底數為0且指數小於零則可能出現0為分母的情況
return 0.0;
}
int absExponent = exponent;
if(exponent<0) absExponent = -exponent;
double result = power(base, absExponent);
if(exponent<0) return 1.0/result;
return result;
}
};