浮点除以零误差,函数告诉一个数除以另一个数的最大幂

问题描述 投票:0回答:2

我正在用 Python 编写一个函数,它告诉我们一个数字除另一个数字的最大幂。我在第 9 行不断收到 ZeroDivisionError: float Floor 除以零的错误。我不知道该怎么做才能尝试修复此错误。

def greatest_power_dividing(divisor,n):
    if divisor == 0: #reason for float division error? 
        raise ValueError("Divisor cannot be zero.")
    
    if divisor > n:
        raise Error("divisor cannot be greater than number input")

    power = 0
    while n//(divisor**power) >= 1: 
        if n//divisor**power <n: #less than, then keep incrementing
            power += 1
        else:
            power -= 1 #go back one power
    return power   

assert greatest_power_dividing(2, 8) == 3
assert greatest_power_dividing(3, 15) == 1
assert greatest_power_dividing(5, 15) == 1
assert greatest_power_dividing(5, 75) == 2
assert greatest_power_dividing(7, 75) == 0

到目前为止,为了排除故障,我已尝试将 / 更改为 // 以便不允许浮动。我还尝试过,如果除数等于 0,则引发 ValueError;如果除数大于 n(用户输入的数字),则引发另一个错误。

当我将 / 更改为 // 时,我也开始出现浮动地板划分错误。

python function
2个回答
1
投票

我认为你搞砸了这个算法。它不断减少功率,所以

(divisor**power) 

限制为零,Python 捕获除以它的结果。
要解决此问题 - 您应该将返回点定义为第二个数字不能被第一个数字整除时的状态。 IE。

n % divisor != 0


0
投票
当 power 为负时,

divisor**power
始终是浮点数,就像代码中一样。随着幂变得越来越负,它最终达到 -1075,此时除数**幂被评估为 0.0。您应该考虑的最小功效是 0 或 1,具体取决于您的目标是什么。基本上,您的代码中需要新的逻辑。

这是您的代码副本,其中包含不同的循环以找到最大的功率。

def greatest_power_dividing(divisor, n):
    if divisor == 0:  # reason for float division error?
        raise ValueError("Divisor cannot be zero.")

    if divisor > n:
        raise ValueError("divisor cannot be greater than number input")

    power = 0
    while n % divisor == 0:
        n //= divisor
        power += 1
    return power
© www.soinside.com 2019 - 2024. All rights reserved.