《算法分析与设计》Week 12

50. Pow(x, n)


Description:

implement pow(xn).

Solution:

一、题意理解

     题意很简单,就是自己实现一个幂函数pow(x,n),即计算x的n次方。这里x是浮点型,n是整型。


二、分析

     1、幂次是整型的情况下,可以分为两种情况,一种n是负数,一种n是非负数。而负数的情况下,仅仅是正数幂次结果的倒数,所以归根结底还是计算x的正整数幂次方。(n=0通过循环控制也可以包含在内)

     2、传统的计算x的n次方就是一个for 0 to n循环,进行n次乘法,计算最后的和,但这肯定不是我们想要的结果。

     3、我们可以想一下,能不能跳跃乘法,也就是做少于n次的乘法。考虑到n是一个整数,可以使用位操作来取,例如n=9,二进制为1001,那么x^9 = (x^8)*(x^0)*(x^0)*(x^1),所以令结果ans = 1,右往左看,当bit = 1时,即令结果ans *= x,0当bit = 0时,即令x *= x,依次类推,就可以在Log(n)的时间内得到结果。当然这里一些变量要用long long类型以防止溢出。

     4、代码如下:

class Solution {
public:
    double myPow(double x, int n) {
        double ans = 1;
        unsigned long long p;
        if( n < 0)
        {
            p = -n;
            x = 1 / x;
        } 
        else
            p = n;
        while(p)
        {
            if( p & 1)
                ans *= x;
            x *= x;
            p >>= 1;
        }
        
        return ans;
    }
};





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值