1. 程式人生 > 實用技巧 >50:Pow(x,n)(C++)

50:Pow(x,n)(C++)

題目地址:https://leetcode-cn.com/problems/powx-n/

題目描述

實現pow(x,n),即計算 x 的 n 次冪函式

題目示例

示例 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] 。

解題思路

思路1:暴力求解。求解思路為迴圈累乘,不過需要注意的是n的正負,該方法求解過程存在超時的問題,時間複雜度O(n)。

思路2:使用折半遍歷進行暴力優化。

思路3:分治+回溯。可以理解為將Pow(x,n)的問題分解為子問題Pow(x,n/2),時間複雜度為O(logn),因為每次都減半。

程式原始碼

思路1

class Solution {
public:
    double myPow(double x, int n) {
        double res = 1.0;
        long num = n;
        if(n < 0)
        {
            x = 1 / x;
            num = -num;
        }
        for(int i = 0; i < num; ++i)
        {
            res 
*= x; } return res; } };

思路2

class Solution {
public:
    double myPow(double x, int n) {
        double res = 1.0;
        long num = n;
        if(n < 0)
        {
            x = 1 / x;
            num = -num;
        }
        for(int i = num; i != 0; i /= 2)
        {
            
if(i % 2 != 0) { res *= x; } x *= x; } return res; } };

思路3

class Solution {
public:
    double myPow(double x, int n) {
        long num = n;
        if(n < 0)
        {
            x = 1 / x;
            num = -num;
        }
        return fast_pow(x, num);
    }
    double fast_pow(double x, long n)
    {
        if(n == 0) return 1.0;
        double half = fast_pow(x, n / 2);
        /*if(n % 2 == 0) return half * half;
        else
            return half * half * x;*/
        return n % 2 == 0? half * half : half * half * x; //對註釋程式碼進行化簡
    }
};