1. 程式人生 > >LeetCode -- 50 Pow(x, n)(C語言版)

LeetCode -- 50 Pow(x, n)(C語言版)

題目描述:

程式碼如下(附有詳解):

double myPow(double x, int n) 
    //如果n為零,表明冪數為0,直接返回1
    if(n == 0) 
        return 1;      
    //如果n為零,表明冪數為0,直接返回x
    if(n == 1) 
        return x;    
    //p值相當於將冪數折半,減少重複計算
    //若n取該範圍內為[-2147483648,2147483647],當n取最小值,
    //那麼當使用n=-n時就會出現溢位的情況,這裡就可以避免出現溢位的情況
    int p=n/2;
    //如果n為負數,那麼將x值取其倒數,然後再將p的值乘以-1,這樣就相當於
    //求x倒數的n次冪,p改為正數
    if(n < 0) { 
        //p值改為正數
        p=-p;
        //x值取其倒數
        x = 1 / x; 
    }      
    double res = myPow(x, p);
    //為了提高時間複雜度,避免重複計算,可以將n不斷除二來減少計算量
    //當n為32時,除二就為16,那麼只需要將x^16與自身相乘即可,若n為奇數
    //那麼只需要再乘以x即可
    if(n % 2 == 0) 
        return res * res;  
    return res * res * x;   
}

劍指offer(12)--數值的整數次冪