%运算符如何在此解决方案中工作到Project Euler#1

时间:2015-07-12 20:11:14

标签: python

我不久前开始学习python,这是我对Euler#1的原始解决方案:

n = 0
for i in xrange(1000):
    if i % 3 == 0 or i % 5 == 0:
        n += i
print n

我在网上找到了这个:

n = 0
for i in xrange(1000):
    if not i % 3 or not i % 5:
        n += i
print n

两者都得出正确答案(233168)。

我真的不明白'不是x%y'在迭代范围时,part正在评估为True / False。有人可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

x % y的结果如果不为零则为True,因此符合以下条件:

if not i % 3

等于if i % 3 == 0

为了更好地理解,请参阅以下bool表:

 i % 3    | not i % 3      | i % 3 == 0

  True    |     False      |  True==0(false)-> False
  False   |     True       |  False==0(false)->True 

其中显示(not i % 3) is equal with (i % 3 == 0)

注意表中的True和False只是从if条件角度而不是结果!

答案 1 :(得分:1)

%是模运算符。在这个例子中

if i % 3 == 0 or i % 5 == 0:

如果i可以被3或5整除,那将是真的。

%(modulo)运算符从第一个参数除以第二个参数得到余数。数字参数首先转换为通用类型。零右参数会引发ZeroDivisionError异常。参数可以是浮点数,例如,3.14%0.7等于0.34(因为3.14等于4 * 0.7 + 0.34。)模运算符总是产生与第二个操作数(或零)具有相同符号的结果;结果的绝对值严格小于第二个操作数的绝对值[2]。

https://docs.python.org/2/reference/expressions.html