leetcode(力扣)第五十题:Pow(x, n)_C++

目录

代码

二分法


代码

class Solution {
public:
    double myPow(double x, int n) {
        /*------------不需要计算的情况------------*/
        if(x==0)return 0;
        if(x==1||n==0)return 1;
        if(x==-1)return n%2==0?1:-1;
        /*------------将底数和指数取绝对值,其正负性对结果的影响放在最后讨论------------*/
        /*------------乘总比除好算------------*/
        double X=abs(x),a=1;
        int N=abs(n);
        /*------------二分法进行快速计算------------*/
        while(N!=0){
            if(X>1000000000000000&&n<0) 
                return 0;//根据规定,单精度小于10^6,双精度小于10^15时判定为0
            if(N%2==1)a*=X;
            X*=X;
            N/=2;
        }
        //讨论底数与指数的正负性对结果的影响
        if(n<0)a=1/a;
        if(x<0&&n%2!=0)return -a;
        else return a;
    }
};

二分法

关于幂次的快速计算,一次次乘效率太差。二分法是一个比较理想的快速计算算法的选择。


令:
a=x^{n}····································································(1)

其中,x为正实数,n为正整数。对n进行分解可得:

n=2\cdot n_{1}+t_{1}··························································(2)

易知n_{1}为自然数,t_{1}为1或0

将(2)代入(1)得:

a=\left (x^{2} \right )^{n_{1}}\cdot x^{t_{1}}

再对n_{1}做同样分解可得:

a=\left (\left (x^{4} \right )^{n_{2}}\cdot \left (x^{2} \right ) ^{t_{1}}\right )^{n_{1}}\cdot x^{t_{1}}

依此类推,即为二分法的过程。本质上就是根据n的二进制各位上的值,将结果乘以x对应次幂。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值