zoukankan      html  css  js  c++  java
  • 《剑指offer》---数值的整数次方

    本文算法使用python3实现


    1 题目描述:

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


    2 思路描述:

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


    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
    
  • 相关阅读:
    PAT乙级1014.福尔摩斯的约会 (20)(20 分)
    PAT乙级1013.数素数
    PAT乙级1012.数字分类 (20)(20 分)
    PAT乙级1011.A+B和C (15)(15 分)
    PAT乙级1025.反转链表 (25)
    PAT乙级1020.月饼(20)
    PAT乙级1015.德才论(25)
    PAT乙级1010.一元多项式求导(25)
    PAT乙级1009.说反话(20)
    PAT乙级1008.数组元素循环右移问题(20)
  • 原文地址:https://www.cnblogs.com/lliuye/p/9101806.html
Copyright © 2011-2022 走看看