代码之家  ›  专栏  ›  技术社区  ›  avacariu

使用布尔或的求值排序

  •  0
  • avacariu  · 技术社区  · 14 年前

    所以我有这段代码。它是有效的(它说1是非素数):

    n = 1
    s = 'prime'
    for i in range(2, n / 2 + 1):
        if n == 1 or n % i == 0:
            s= 'non-' +s
            break
    
    print s
    

    我的问题是如果我把第四行改成: if n % i == 0 or n == 1:

    为什么?因为我用的是 or

    (我还在学习布尔运算,所以我可能犯了一些基本的错误。)

    谢谢你的回答,我从来没有意识到我的问题 range()

    不管怎样,谢谢你的回答!

    5 回复  |  直到 14 年前
        1
  •  1
  •   paxdiablo    14 年前

    fine . % 先评估,然后 == ,那么 or

         ___or___
        /        \
      ==          ==
     /  \        /  \
    n    1      %    0
               / \
              n   i
    

    for 循环根本没有被执行,所以 s 仍设置为 "prime" .

    2,n/2+1 什么时候 n 是1等于 2,1

    事实上,它不会在哪里执行 2/2+1 是2和范围 2,2 无法执行。这些值是起始值和终止值,而不是起始值和结束值(最后一个值)——在那里,2被认为是一个素数是偶然的,因为它的初始化 s :-)

    #!usr/bin/python
    
    n = 9
    s = 'prime'
    if n == 1:
        s = 'non-prime'
    else:
        i = 2
        while i * i <= n:
            if n % i == 0:
                s= 'non-prime'
                break
            i = i + 1
    print s
    

    一直到现在都是浪费 n/2 ,的平方根 n 这就是所需要的。

        2
  •  2
  •   Kenan Banks    14 年前

    在这两种情况下,循环体都不会运行,因为当“n”为1时,它不在(n,n/2+1)的范围内

    您发布的代码说1是prime(同样,因为循环体根本不执行)

        3
  •  1
  •   Dyno Fu    14 年前

    我认为问题是当n为1时,循环被跳过。

        4
  •  1
  •   Alex Martelli    14 年前

    其他答案已经正确地解决了您的特定问题(换句话说,就是循环只在 n/2 + 1 > 2 n/2 > 1 n > 2 使用新式除法[[python 3或将来的适当导入或标志…], n > 3 具有经典风格的截断除法)。

    请回答您提出的具体问题:

    既然我在用还是应该用这个 顺序不算数?

    计算原因 or (就像 and )是短路操作员:具体来说, 从左向右,如果左操作数为真则停止(因为它不需要知道右操作数)。这对于您的特定代码并不重要,但在以下情况下非常重要,例如:

    if i == 0 or n / i > 3: ...
    

    如果 如果不是从左向右(并尽快停止),即使在 i 等于 0 是一个int,至少;-)。

        5
  •  0
  •   Tony Veijalainen    14 年前
    for n in range(101):
        s = 'prime'
        if n < 2 or not (n & 1): ## not(n & 1) == is even number (last bit 0) == not (n % 2) 
            s = 'non-'+s
        else:
            for i in range(3, int(n**0.5) + 1,2):
                 if not(n % i):
                     s= 'non-' +s
                     break
        print "%i is %s" % (n,s)
    

    你不需要检查所有的偶数,你可以在n的平方根处停止检查。