1. 程式人生 > >劍指offer 12 數值的整數次方

劍指offer 12 數值的整數次方

給定一個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;
    }
};