剑指Offer 16. 数值的整数次方(Medium)/ 50. Pow(x, n) / 372. (a^b对1337取模的)超级次方(Medium)

在这里插入图片描述
【题目链接】

  1. 数值的整数次方(快速幂,清晰图解)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution:
    def myPow(self, x: float, n: int) -> float:
        # 若x为0,则直接返回0
        if x == 0: return 0

        # 若幂为负数,则x变为倒数,n变为相反数
        if n < 0: x, n = 1/x, -n

        # 初始化累乘器变量为1,用于每次二分时,使用累乘来保存上一轮单出来的x
        res = 1

        # 当幂不为0时,进行循环二分,直至n为0结束
        while n:
            # 当且仅当某一个二进制位为1时,才累乘到最终的结果中
            if n & 1:
                res *= x
            
            n >>= 1 # 每轮对幂n进行二分
            x *= x  # 二分完后,为保证原值不变,则需用x^2来代替原来的x

        return res            

372. (a^b对1337取模的)超级次方

在这里插入图片描述

class Solution:
    def superPow(self, a: int, b: List[int]) -> int:
        def my_pow(x, n, mod):
            # 若x为0,则直接返回0
            if x == 0: return 0

            # 若幂为负数,则x变为倒数,n变为相反数
            if n < 0: x, n = 1/x, -n

            # 初始化累乘器变量为1,用于每次二分时,使用累乘来保存上一轮单出来的x
            res = 1

            # 当幂不为0时,进行循环二分,直至n为0结束
            while n:
                # 当且仅当某一个二进制位为1时,才累乘到最终的结果中
                if n & 1:
                    res = res * x % mod
                
                n >>= 1 # 每轮对幂n进行二分
                x = x * x % mod  # 二分完后,为保证原值不变,则需用x^2来代替原来的x

            return res

        cur_mod = 1337
        res = 1

        # for n in reversed(b):
        for n in b[::-1]:
            res = res * my_pow(a, n, cur_mod) % cur_mod
            a = my_pow(a, 10, cur_mod)

        return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值