0

所以我得到了这段代码。它有效(它说 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:,它就不起作用(它说 1 是素数。)

这是为什么?既然我正在使用or它们中的任何一个是否应该是 True 所以订单不计算在内?

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

提前致谢!

编辑:感谢您的回答;我从来没有意识到我的range()功能问题。关于代码工作和不工作:我不知道发生了什么。我可能在途中的某个地方犯了一些错误(可能在运行脚本之前忘记保存。虽然我可以发誓它的工作方式不同:P)。也许我只是累了...

无论如何,感谢您的回答!

4

5 回答 5

2

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

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

于 2010-08-23T03:39:04.030 回答
1

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

于 2010-08-23T03:37:39.273 回答
1

优先级很好%首先被评估,然后是==,然后是or,因此它分解为:

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

你的问题是你的for循环根本没有被执行,所以它s仍然设置为"prime".

范围2,n/2+1何时n为 1 等于2,1将导致主体不被执行。

事实上,它不会在 2 的地方执行,n因为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

于 2010-08-23T03:40:09.123 回答
1

其他答案已经正确解决了您的具体问题(换句话说,n/2 + 1 > 2循环n/2 > 1n > 2在],n > 3具有经典风格的截断除法)。

写你提出的具体问题:

因为我正在使用或者应该是其中任何一个是 True 所以订单不计算在内?

该顺序确实很重要,因为or(like and) 是一个短路运算符:具体来说,or保证从左到右,如果左操作数为真则停止(因为它不需要知道右操作数)。这对您的特定代码无关紧要,但在以下情况下至关重要:

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

如果or不是从左到右(并尽快停止),即使i等于,右手操作数也可能会被执行0——但除法会引发异常!使用 Python 的规则,此代码片段不会引发异常(如果i是 int,至少;-)。

再说一遍:这与您遇到的具体问题无关(请参阅其他答案和此问题的开头),但是了解未来对您很重要,因此,既然您问了,我就借此机会解释一下!-)

于 2010-08-23T03:48:38.700 回答
0
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 的平方根处停止检查。

于 2010-08-23T04:06:09.770 回答