面试题-数值的整数次方

题目来源:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

 

示例 1:

输入: 2.00000, 10
输出: 1024.00000

说明:

  • -100.0 < x < 100.0
  • n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

这题有个测试用例是x=0.00001,n=2147483647。如果直接按常规方法,丢一个循环去做,会内存溢出。。

所以得用非常规方法,减小运算量。

我们都知道,十进制数可以表示为二进制数,即有:

n \rightarrow b_{m-1}...b_2b_1b_0

n = 2^{m-1}b_{m-1}+...+2^2b_2+2^1b_1+2^0b_0

x^n = x^{2^{m-1}b_{m-1}+...+2^2b_2+2^1b_1+2^0b_0}=x^{2^{m-1}b_{m-1}}...x^{2^2b_2}x^{2^1b_1}x^{2^0b_0}

所以可以设置一个循环,设置两个量来分别存储b_ix^{2^{i-1}}

class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        ans = 1
        if n < 0:               
            x, n = 1/x, -n
        while n:
            if n & 1:          # 判断最低位是否为1
                ans *= x       # 对应位*对应x
            x *= x             
            n >>= 1            # 去除n最后一位
        return ans

 参考:

https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/solution/mian-shi-ti-16-shu-zhi-de-zheng-shu-ci-fang-kuai-s/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值