我是python的新手,我遇到了一些问题,我应该使用嵌套循环打印所有小于50的素数。
以下是代码:
i = 2
while(i < 50):
j = 2
while(j <= (i/j)):
if not(i%j):
break
j = j + 1
if (j > i/j):
print(i, " is prime")
i = i + 1
它的输出是:
2 is prime
3 is prime
5 is prime
7 is prime
11 is prime
13 is prime
17 is prime
19 is prime
23 is prime
29 is prime
31 is prime
37 is prime
41 is prime
43 is prime
47 is prime
所以在3之后,j应该是2而我应该是4.那么它不是素数,所以它会回到while循环。
这个过程重新开始。 j和i应该加1。所以j应该是3,我应该是5,5是素数,然后它再次增加到6。
所以j应该仍然是3而我应该是6.但是(3&lt; =(6/3))&lt; - 这不是真的,所以它转到if语句和3是j大于2是i / j,这意味着6应该是素数。
但事实并非如此。你可以通过常识来说明这一点。而且我想知道我在这里做错了什么部分。我在这里错过任何增量吗?谢谢。
答案 0 :(得分:0)
缩进代码如下。
i = 2
while(i < 50):
j = 2
while(j <= (i/j)):
if not(i%j):
break
j = j + 1
if (j > i/j) :
print(i, " is prime")
i = i + 1
在您的代码中,j
每次增加i
时都会初始化为2
请参阅此代码段if not(i%j): break
如果任何j
除以i
,则if not(i%j)
变为true
并且循环中断但j <= (i/j)
仍然成立,否则控件将不会进入此循环。所以控制跳过print(i, " is prime")
因此if(j > i/j)
成为true
的唯一方法就是上面的循环永远不会中断。这意味着i
没有得到任何除数,因此i
是一个素数。
答案 1 :(得分:0)
首先,我想发布代码的正确语法。
i = 2
while(i < 50):
j = 2
while(j <= (i/j)):
if not(i%j):
break
j = j + 1
if (j > i/j):
print(i, " is prime")
i = i + 1
通过编写这样的代码,我们可以做几件事。我们能做的第一件事是获得一个很好的视觉内容,而不是假设任何东西。我们能够做的第二件事是看看递增在哪里。
现在,让我们来看看这段代码内容。首先要意识到我们是从i = 2开始的。然后我们初始化一个while循环,当我大于50时,它将停止。
所以,现在我们在第一个while循环中,我们接下来要做的就是调用 j 。我们可以看到,这个变量等于2。它不仅等于2,而且每次我们下到第一个循环的底部,当我> = 50时,我们回到开始并再次将j重新初始化为2。
这意味着即使我们在SECOND(NESTED)while循环中添加j,j也永远不会开始为2。
如果我理解你的问题,那么这里的一切都应该有意义。在我看来,这个代码唯一奇怪的是:
if not (i%j)
这似乎有点奇怪,因为如果它说:
会更加神职人员 if (i%j == 0):
break
如果您有任何其他问题,请随时提出。如果您觉得这很有帮助,请随时接受它作为您的答案:)
答案 2 :(得分:0)
我制作了这个无限质数生成器:
def primes_generator():
n = 1
while True:
for x in range(2, n):
if n % x == 0:
#not prime
break
else:
#prime
yield n
n+=1
您可以像这样使用它:
primes = primes_iterator()
for prime in primes:
print(i)