[LeetCode-50.求幂Pow(x,n)]

暴力法        

        pow(x,n)就是n个x相乘,直接使用循环暴力计算,时间复杂度为O(n),在LeetCode的提交后容易超时。

double pow1(double x,int n){
    long long N = n;
    if(x == 0) return 0;
    if(x == 1 ||n ==0) return 1.0;
    if(N<0){
        N = -n;
        x = 1/x;
    }
    double ans = 1.0;
    for(int i =0;i<N;++i){
        ans*=x;
    }
    return ans;
}

快速幂+递归

         快速幂算法本质是二分法,在求x的n次方时,我们只需要算出x的(n/2)次方即可。当n为偶数时,则x^n = x^(n/2) * x^(n/2);当n为奇数时,x^n = x^(n/2)*x^(n/2)*x即可。

double powHelp(double x,long long n){
    if(n == 0) return 1.0;
    double half = powHelp(x,n/2);
    return n%2 == 0?half*half:half*half*x;
}
double pow2(double x,int n){
    long long N = n;
    if(x == 0) return 0;
    if(x == 1 ||n ==0) return 1.0;
    return n>0?powHelp(x,n):1/powHelp(x,-n); 
}

快速幂 +迭代

对于任意一个数n,都有他自己的二进制形式,也即是说,对于一个数n,它可以拆分以下形式:

2^{a}+2^{b}+2^{c}+2^{d}+....+2^{e}+....


例如,对于77,它的二进制为 0100  1101,它拆分为以下形式

77\rightarrow 0100 110 =2^{7}*0+2^{6}*1+2^{5}*0+2^{4}*0+2^{3}*1+2^{2}*1+2^{1}*0+2^{0}*1 =2^{6}+2^{3}+2^{2}+2^{0}=64+8+4+1

而对于x^77次方则可以分解为以下形式:

x^{77}=x^{64+8+4+1}=x^{64}*x^{8}*x^{4}*x^{1}

则可以使用求2进制的方法对x进行倍乘,进而求得x^77的结果。

 // 迭代法
    double quickPow2(double x,uint32_t n){
        double ans = 1.0;
        // 根据x的二进制中1的位置来倍乘x
        double x_con = x;
        while(n>0){
            // 当二进制位为1的时候,将x_con乘入答案
            if(n%2 == 1) ans*=x_con;
            // 每次进一位,x_con的值就要倍乘
            x_con*=x_con;
            n/=2;// 求下一个二进制位
        }
        return ans;
    }

    double myPow(double x, int n) {
        long long N = n;
        if(N == 0 || x == 1) return 1.0;
        if(N == 0) return 0;
        return n>0?quickPow2(x,N):1.0/quickPow2(x,-N);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值