理解Python中取模运算符(%)的困惑

-4 投票
1 回答
40 浏览
提问于 2025-04-14 16:48
ans=0
while ans<50:
   if ans%10==0:
     ans+=5
   elif ans%5==0:
     ans+=10
   else:
     ans+=15
print(ans)

我非常抱歉浪费你们宝贵的时间,但我就是搞不懂这个值是怎么变成55的。
我不太明白代码的执行过程,所以希望有人能给我解释一下。

1 个回答

1

在Python中,取模运算符(%)实际上是调用了一个叫做__mod__的方法。这个方法的作用是返回整数除法的余数,如果没有余数,就返回0。

为了让你更容易理解,这里有一些具体的例子:

  • 5 % 2 => 1(2可以在5里面放进去两次,得到4,剩下1)
  • 50 % 5 => 0(50可以被5整除,没有余数)
  • 0 % n => 0(任何数乘以0都是0,所以0可以被任何数整除,结果都是0)

这也说明了你的问题;如果一开始就把值设为0,那么第一次取模检查总是会通过。你可以试着把它初始化为None,然后把else块放到一个最开始的if ans is None:中,这样就可以把值设为15。第一次循环后就不需要再保留else块,因为15的倍数一定能被5整除。当然,如果这是为了模拟你真实的问题,那就保留else块,但还是要把ans初始化为None,并先检查这个。

接下来解释一下代码的流程:

ans=0
while ans<50:
    # check if ans is an integer multiple of 10. First run: True. Add 5.
    # Now ans is 5 and this check won't pass on the second run
    if ans%10==0:
        ans+=5
    # check if ans is an integer multiple of 5. First run never reaches here.
    # Second run reaches here, adds 10 so the next run is also not a
    # multiple of 10 (5, 15, 25, 35, 45, 55)
    elif ans%5==0:
        ans+=10
    else:
        ans+=15
# Print whatever is in ans now (55, always)
print(ans)

我提议的修改仍然会得到55这个结果,因为它会直接跳到15,而15仍然不能被10整除。

你也可以看看维基百科关于取模运算的内容,获取更多信息。

撰写回答