劍指offer之數值的整數次方(C++/Java雙重實現)

1.題目描述

實現函數double Power(double base, int exponent),求base的exponent次方。不得使用庫函數,同時不需要考慮大數問題。
示例 1:
輸入: 2.00000, 10
輸出: 1024.00000
示例 2:
輸入: 2.10000, 3
輸出: 9.26100
示例 3:
輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25
說明:
-100.0 < x < 100.0
n 是 32 位有符號整數,其數值範圍是 [−231, 231 − 1] 。

在這裏插入圖片描述

2.問題分析

思路描述:因爲不用考慮大數問題,所以只需要循環地去計算就可以了,但是單純的循環去算,比如:

for(int i = 1; i < n; i ++)
	x *= x;

是會超時的。
所以這裏使用快速冪的方法,那麼什麼是快速冪呢我們看一個例子:
我們要求29

我們知道9的二進制是1001,也就是1 * 20+0 * 21+0 * 22+1 * 23
那麼29 =21 * 20 * 20 * 21*20 * 22*21 * 23
我們發現,每次指數乘的值都是前一個值的2倍,當 n 對應位爲0時跳過

3.代碼實現:

3.1C++代碼

class Solution {
public:
    double myPow(double x, int n) {
        if(x == 1 || n == 0) return 1;
        double ans = 1;
        long num = n;
        if(n < 0){
            num = -num;
            x = 1/x;
        }
        while(num){
            if(num & 1) 
            ans *= x;
            x *= x;
            num >>= 1;
        }
        return ans;
    }
};

1.(num&1)是判斷指數的二進制此位是否爲1
2.x=x*x:每一次判斷一次二進制數就往後移動一位然後x就變爲原來的平方

3.2Java代碼

class Solution {
    public double myPow(double x, int n) {
     if(x == 1 || n == 0) return 1;
        double ans = 1;
        long num = n;
        if(n < 0){
            num = -num;
            x = 1/x;
        }
        while(num>0){
            if((num&1)==1)
            ans *= x;
            x *= x;
            num >>= 1;
        }
        return ans;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章