数据结构学习 jz16 数值的整数次方

关键词:快速幂 位运算

之前已经学过快速幂了,所以只是回忆。快速幂有递归版和非递归版。

题目:

这道题和之前的快速幂的区别是 n可能为负数。分类讨论即可。

思路:

区分正负:

if (n < 0) return POW(1.0 / x, -b);
else return POW(x, b);

注意:

把n赋给long b。

因为

如果n=-2^31,如果取-n,就会爆,因为int装不下2^31。

long b = n;

复杂度计算:

时间复杂度O(logN)

空间复杂度O(1) 非递归版

代码:

非递归版:

class Solution {
public://快速幂非递归版
    double myPow(double x, int n) {
        long b = n;
        if (n < 0) return POW(1.0 / x, -b);
        else return POW(x, b);
    }
    double POW(double x, long n)
    {
        double res = 1;
        double rex = x;
        while (n)
        {
            if (n & 1)
            {
                res *= rex;
            }
            rex *= rex;
            n=n >> 1;
        }
        return res;
    }
};

递归版:

class Solution {
public://快速幂递归版
    double myPow(double x, int n) {
        long b=n;
        if(n<0) return POW(1.0/x,-b);
        else return POW(x,b);
    }
    double POW(double x, long n)
    {
        double res=0;
        if(n==1) return x;
        if(n==0) return 1;
        if(n&1)
            res=x*POW(x,n-1);
        else
        {
            res=POW(x,n/2);
            res=res*res;
        }
        return res;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值