(python version) 剑指offer 16.数值的整数次方 python

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。

解题思路

  • 思考指数函数的定义
  1. 底数共有三种情形:
    (i) base > 1
    (ii) 0 < base < 1
    (iii) base < 0

  2. 底数为正数 (i)、(ii)
    考虑指数为正数以及负数的情形 => 使用 flag

  3. 底数为负数 (iii)
    考虑指数为正数以及负数的情形 => 使用 flag
    能否被2整除,若能被2整除,则为正数,若不能整除,则为负数 => 使用 pos

  4. 最终判定返回的数

  • flag 决定是否取倒数
  • pos 判定正负数

e.g. 底数为正,若 flag 为正数,则返回 ans => ans
e.g. 底数为正,若 flag 为负数,则返回 ans的倒数 => 1/ans
e.g. 底数为负,若flag为正,pos为正数,则返回 => ans
e.g. 底数为负,若flag为负,pos为正数,则返回 => 1/ans
e.g. 底数为负,若flag为正,pos为负数,则返回 => - ans
e.g. 底数为负,若flag为负,pos为负数,则返回 => - 1/ans

在这里插入图片描述

Python 代码

将方法一思考简化

class Solution:
    def Power(self, base, exponent):
	    """
	    给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
	    保证base和exponent不同时为0 (0的0次方无意义)
	    """
	    # write code here
	    num = abs(base)
	    ans = 1
	    flag = True   # 判断指数是否为正,正的话维持不变,负的话返回倒数
	    pos = True    # 判断底数是否为正,在指数为负的时候辅佐判断
	
	    if exponent == 0:
	        if base != 0:
	            return 1
	    if base == 0:
	        if exponent !=0:
	            return 0
	    
	
	    for i in range(abs(exponent)):
	        ans *=num
	
	    if base > 1:
	        if exponent < 0:
	            flag = False
	    elif 0 < base < 1:        
	        if exponent <0:
	            flag= False
	    elif base <0:
	        if exponent <0:
	            flag = False
	        if exponent % 2 !=0:
	            pos = False
	    else:
	        pass
	
	    # 最终透过 flag & pos 判断
	    if flag and pos:
	        return ans
	    elif flag and not pos:
	        return -ans
	    elif not flag and pos:
	        return 1/ans
	    else:
	        return -1/ans

方法一

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        """
        给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
        保证base和exponent不同时为0
        """
        # write code here
        # 0的0次方无意义
        num = abs(base)
        ans = 1
        if exponent == 0:
            if base != 0:
                return 1
        if base == 0:
            if exponent !=0:
                return 0
        else:

            for i in range(abs(exponent)):
                ans *=num

            if base > 1:
                if exponent > 0:
                    return ans 
                else:
                    return 1/ans
            elif 0 < base < 1:
                if exponent >0:
                    return ans
                else:
                    return 1/ans
            elif -1 <base <0:
                print(base)
                if exponent >0:
                    if exponent %2 == 0:
                        return ans
                    else:
                        return -ans
                else:
                    if exponent %2 == 0:
                        return 1/ans
                    else:
                        return -1/ans
            elif base<= -1:
                if exponent >0:
                    if exponent %2 == 0:
                        return ans
                    else:
                        return -ans
                else:
                    if exponent %2 == 0:
                        return 1/ans
                    else:
                        return -1/ans
            else:
                pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值