@剑指offer(Python)数值的整数次方

剑指offer刷题笔记12(Python)

题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

思路1

偷懒……直接利用Python的内置函数pow()。

代码1

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        return pow(base,exponent)

思路2

利用乘法,不过得考虑底数是否为0,以及指数与0的关系。当指数exponent为0时,任何数的0次方都是1;当exponent不等于0,但底数base为0时,0的任何次方都为0;当底数不为0,这时候要区分指数exponent与0的关系:当指数大于0,直接将底数base连乘exponent次就好;当指数小于0,将指数取相反数,换成正数,然后在连乘,最后将结果取倒数。

代码2.1

 -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        if exponent == 0:
            return 1
        if base == 0:
            return 0
        flag = True        # 设置一个指数是否小于0的标志,默认为True,即指数为正数。
        if exponent < 0:
            exponent = -exponent
            flag = False
        result = 1
        for i in range(exponent):
            result *= base
        return result if flag else 1/result

这种方法能进行一下优化,利用递归:
在这里插入图片描述

代码2.2

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        if exponent == 0:
            return 1
        if base == 0:
            return 0
        flag = True        # 设置一个指数是否小于0的标志,默认为True,即指数为正数。
        if exponent < 0:
            exponent = -exponent
            flag = False
        if exponent % 2 == 0:     # 判断指数是否为偶数
            res = self.Power(base,exponent//2)
            res *= res
        else:
            res = self.Power(base,exponent//2)
            res *= res
            res *= base
        return res if flag else 1/res

思路3

利用快速幂,具体思路我在另一篇博客里进行了介绍:https://blog.csdn.net/ggdhs/article/details/90141960

# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        if exponent == 0:
            return 1
        if base == 0:
            return 0
        flag = False
        if exponent<0:
            exponent = -exponent
            flag = True
        res = 1
        while exponent:
            if exponent & 1:   # 判断当前的最后一位是否为1,如果为1的话,就需要把之前的幂乘到结果中。
                res *= base
            base *= base   # 一直累乘,如果最后一位不是1的话,就不用了把这个值乘到结果中
            exponent = exponent >> 1
        return res if not flag else 1/res

猜你喜欢

转载自blog.csdn.net/ggdhs/article/details/90139320
今日推荐