所以我有这段代码。它起作用(它说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)。也许我只是累了......
谢谢你的答案!
答案 0 :(得分:2)
在这两种情况下,循环体都不会运行,因为当'n'为1时,它不在(n,n / 2 + 1)范围内
你发布的代码说1是素数(再次,因为循环体根本不执行)
答案 1 :(得分:1)
我认为问题是当n为1时,跳过循环。
答案 2 :(得分:1)
优先顺序为fine。首先评估%
,然后评估==
,然后评估or
,以便将其细分为:
___or___
/ \
== ==
/ \ / \
n 1 % 0
/ \
n i
您的问题是您的for
循环根本没有被执行,因此s
仍然设置为"prime"
。
2,n/2+1
为1时的范围n
等同于2,1
,这将导致正文无法执行。
事实上,由于n
为2且范围2/2+1
未执行,因此2,2
为2时不会执行。这些值是起始值和终止值,而不是开始和结束(最后)值 - 由于s
的初始化,2被认为是素数,这只是偶然的: - )
请改为尝试:
#!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
的平方根就是所需要的。
答案 3 :(得分:1)
其他答案已经正确地解决了您的具体问题(换句话说,只有在n/2 + 1 > 2
时才会执行循环,即n/2 > 1
,这意味着n > 2
具有新的问题样式划分[[python 3或从未来合适的导入或标志...]],n > 3
与经典样式截断除法。)
你提出的具体问题:
因为我正在使用或应该是那样的 其中一个是真的所以 订单不算?
订单 计算,因为or
(如and
)是一个短路运算符:具体而言,or
保证从左到右,如果左操作数为真,则停止(因为它不需要知道正确的操作数)。这与您的特定代码无关,但在例如:
if i == 0 or n / i > 3: ...
如果or
没有从左到右(并且尽快停止),即使i
等于0
,右手操作数也可能会被执行 - 但是师会提出例外!使用Python的规则,此代码片段不会引发异常(如果i
至少是int,则为 - )。
再说一遍:这与你所遇到的具体问题无关(见其他答案和这个问题的开头),但是对你来说很重要,因为你问过,我拿了有机会解释! - )
答案 4 :(得分: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的平方根处停止检查。