码迷,mamicode.com
首页 > 其他好文 > 详细

《剑指offer》---数值的整数次方

时间:2018-06-04 14:01:57      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:under   python   power   8K   复杂度   spl   高效   begin   整数   

本文算法使用python3实现


1. 问题1

1.1 题目描述:

??给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方
??时间限制:1s;空间限制:32768K


1.2 思路描述:

??方法一:对exponent大于0的情况:计算 $ \underbrace{base \times base \times \ldots \times base}_{\rm exponent 个base} $ ;对于exponent小于0的情况:对exponent取绝对值,按照之前的方法求得结果后取倒数。(复杂度为 $ O(n) $ )
??方法二:同样是分为exponent大于0或小于0的情况,小于0时求倒数。但是对于大于0时,计算方法如下:\[ a^n= \begin{cases} a^{\frac{n}{2}} \times a^{\frac{n}{2}} , & \text {if n 为偶数} \\ a^{\frac{n}{2}} \times a^{\frac{n}{2}} \times a, & \text{if n 为奇数} \end{cases} \]
其中 $ a = base, n =exponent $
对于该部分可以使用递归进行实现。(复杂度为 $ O(\log_2n) $ )
?? 注意:当base为0时无意义,但是在python中由于精度问题,需对base是否为0进行判断


1.3 程序代码:

(1)方法一

class Solution:
    def Power_1(self, base, exponent):
        # 普通算法
        # 对0进行界定
        if base > -1e-7 and base < 1e-7:
            return 0
        if exponent == 1:
            return base
        if exponent == 0:
            return 1
        exp = abs(exponent)
        res = 1.0
        for i in range(exp):
            res *= base
        if exponent > 0:
            return res
        else:
            return 1/res



(2)方法二:

class Solution:
    def Power_2(self, base, exponent):
        # 高效算法
        if base > -1e-7 and base < 1e-7:
            return 0
        if exponent == 1:
            return base
        if exponent == 0:
            return 1
        exp = abs(exponent)
        ans = self.Power_2(base, exp >> 1)
        ans = ans * ans * 1.0
        if exp & 1 == 1 :
            # 如果幂为奇数
            ans = ans * base
        if exponent < 0:
            return 1/ans 
        return ans

《剑指offer》---数值的整数次方

标签:under   python   power   8K   复杂度   spl   高效   begin   整数   

原文地址:https://www.cnblogs.com/lliuye/p/9101806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!