[LeetCode]50.Pow(x, n)

160 篇文章 28 订阅
【题目】

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;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@SmartSi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值