math模块的pow()计算幂时提示OverflowError: math range error (python)

背景

        刷题的时候用 ** 提示超时,就想着利用 python的 math 模块偷个懒,因为math.pow() 始终调用c语言写的那个代码,时间复杂度老低了,可能会加快速度,但是出现了错误,没办法只能手写快速幂

错误原因

        math.pow()函数计算幂运算,因为结果数值过大导致溢出。

解决办法

        手写快速幂自己实现快速幂

代码

mod 是因为数字过大要对 109+7取余数,mod = 109+7

def q_pow(self,n,m,mod):
    res = 1
    while m:
        if m&1:
            res = res*n % mod
        n = n*n%mod
        m = m>>1
    return res

那道题的完整链接加代码如下: 1808. 好因子的最大数目

class Solution:
    def maxNiceDivisors(self, primeFactors: int) -> int:
        if primeFactors<=4:
            return primeFactors
        mod = 10**9+7
        a = primeFactors//3
        b = primeFactors%3
        
        # 直接求不行会超时
        # if b==0:
        #     return 3**a%mod
        # elif b==1:
        #     return 3**(a-1)*4%mod
        # else:
        #     return 3**a*2%mod

        # 手写快速幂
        if b==0:
            return self.q_pow(3,a, mod)
        elif b==1:
            return (self.q_pow(3,a-1, mod)*4) % mod
        else:
            return (self.q_pow(3,a, mod)*2) % mod
        
    def q_pow(self,n,m,mod):
        res = 1
        while m:
            if m&1:
                res = res*n % mod
            n = n*n%mod
            m = m>>1
        return res
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南自动化学院至渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值