码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode]50.Pow(x, n)

时间:2015-01-29 17:35:58      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:leetcode   分治   二分查找   

【题目】

Implement pow(xn).

【分析】

采用分治思想。

技术分享

对于n是奇数时,x^n = x^(n/2)*  x^(n/2)* x

对于n是偶数时,x^n = x^(n/2)*  x^(n/2)      

x^(n/2)用一个变量sub记录,x^n = sub * sub * x^(n % 2)  这样 x^(n/2)就计算一次

注意:n有可能是负数  转换为  1.0 / pow(x, -n)   此时-n有可能溢出      n 逐渐减半的过程中就会解决溢出问题。

【代码】

class Solution {
public:
    double pow(double x, int n) {
        // 终止条件
        if(n < 0){
            return 1.0 / pow(x,-n);
        }//if
        if(n == 0){
            return 1.0;
        }//if
        if(n == 1){
            return x;
        }//if
        // 递归
        // x^n = x^(n/2) * x^(n/2) *x^(n%2)
        double sub = pow(x,n / 2);
        return  sub * sub * pow(x,n % 2);
    }
};

这是一种错误的答案:n溢出导致死循环
技术分享

【代码二】

/*********************************
*   日期:2015-01-29
*   作者:SJF0115
*   题目: 50.Pow(x, n)
*   网址:https://oj.leetcode.com/problems/powx-n/
*   结果:AC
*   来源:LeetCode
*   博客:
**********************************/
#include <iostream>
using namespace std;

class Solution {
public:
    double pow(double x, int n) {
        // 负数
        if(n < 0){
            return 1.0 / pows(x,-n);
        }//if
        // 正数
        else{
            return pows(x,n);
        }
    }
private:
    double pows(double x,int n){
        // 终止条件
        if(n == 0){
            return 1.0;
        }//if
        if(n == 1){
            return x;
        }//if
        // 递归
        // x^n = x^(n/2) * x^(n/2) *x^(n%2)
        double sub = pow(x,n / 2);
        return  sub * sub * pow(x,n % 2);
    }
};



int main(){
    Solution solution;
    double x = 2.5;
    int n = 2;
    double result = solution.pow(x,n);
    // 输出
    cout<<result<<endl;
    return 0;
}

技术分享






[LeetCode]50.Pow(x, n)

标签:leetcode   分治   二分查找   

原文地址:http://blog.csdn.net/sunnyyoona/article/details/43273933

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!