穿上你的调试裤,我们进去。
首先,代码不会按照编写的方式运行。变量counter 和impar 未定义。第一步是删除这样的语法错误。看起来我们想从 0 开始计数器,并且使用 impar 的行不是必需的,因此我们可以删除它。
odd = 3
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
if number == 2:
print('2')
number += 2
elif (number % 2) != 0:
while odd < number:
print('while2')
remnant = number % odd
if (number % odd) != 0 and odd == (number - 1):
print(f'{number}.')
odd = 3
number += 1
break
elif (number % odd) == 0:
break
odd += 2
elif (number % 2) == 0:
number += 1
odd = 3
现在代码运行没有错误,但它所做的只是打印
2
while2
然后终止失败。
所以我们知道我们只进入了一次while odd < number 循环,并且在该循环期间我们不打印任何内容。如果我们还在其中打印odd 和number 的值,我们会看到odd = 3 和number = 5。两个 if 条件都不满足,odd += 2 行被命中。现在odd = 5 和 while 循环退出而不打印 5,即使 5 是素数。如果我们想通过满足条件odd == (number - 1) 来执行我们的打印语句,我们最好在递增odd 时以1 为步长。我们换成odd += 1,重新运行代码。
现在当我说我需要 2 个素数时,它会打印出来
2
5
7
然后永远打印while2。至少它打印素数!但是它跳过了 3 并且打印了太多,我不得不使用 Ctrl-C 退出程序。打印了太多素数,因为从未达到外部循环 while counter <= limit: 条件。在循环内部,我们从不增加 counter 的值。每当我们打印一个素数时,我们都需要增加计数器。
另外,为了确保我们打印 3,请查看循环中的第一个 if 条件。
if number == 2:
print('2')
number += 2 # Oops, we skipped over 3
让我们更新一下:
if number == 2:
print('2')
print('3')
counter += 2 # Let's count both of these!
number += 2
在另一个打印之后添加counter += 1,重新运行我们得到的代码
How many primes do you need: 2
2
3
5.
How many primes do you need: 3
2
3
5.
7.
糟糕,我们得到的比我们需要的多。这是因为当counter == limit 我们再运行一次while 循环。让我们将 while 循环条件更改为 while counter < limit:。这种变化让我们得到了正确数量的素数。
How many primes do you need: 4
2
3
5.
7.
但是如果我们要 5 个
How many primes do you need: 5
2
3
5.
7.
而且程序永远不会退出。如果我们检查奇数和数字的值,我们会看到循环以odd=3 和number=9 一遍又一遍地运行。
当奇数=3 和数=9 时通过代码推理。当我们点击这段代码时,我们会跳出while odd < number while 循环
elif (number % odd) == 0
break
但是我们从不增加number的值,所以下一次循环仍然等于9。让我们将其更新为
elif (number % odd) == 0
number += 1
break
现在当我们重新运行我们得到的代码时
How many primes do you need: 5
2
3
5.
7.
11.
嘘!它在要求更多素数时也有效。这是当前的代码:
odd = 3
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
if number == 2:
print('2')
print('3')
counter += 2
number += 2
elif (number % 2) != 0:
while odd < number:
if (number % odd) != 0 and odd == (number - 1):
print(f'{number}.')
odd = 3
number += 1
break
elif (number % odd) == 0:
number += 1
break
odd += 1
elif (number % 2) == 0:
number += 1
odd = 3
现在我们有了工作代码,让我们改进它!我们的错误之一是我们忘记在一种情况下将数字增加 1。请注意,无论我们如何退出外部 while 循环while counter <= limit:,我们都希望增加数字。因此,与其在很多地方都这样做,不如将所有这些都移到 while 块的末尾。
每当退出 while 块时,我们还设置了 odd=3。我们要确保在 while 循环开始时奇数 = 3,所以让我们把它移到那里。现在elif (number % 2) == 0: 块中没有更多代码,所以我们可以删除该行。
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
odd = 3
if number == 2:
print('2')
print('3')
counter += 2
elif (number % 2) != 0:
while odd < number:
if (number % odd) != 0 and odd == (number - 1):
print(f'{number}.')
counter += 1
break
elif (number % odd) == 0:
break
odd += 1
number += 1
我认为如果 while 循环在满足条件时结束,而不是在 break 语句上结束,代码会更清晰。如果我们发现数字可以被某物整除,或者我们用完了要检查的数字,我们希望 while 循环结束。
`while number % odd != 0 and odd < number:`
在 while 循环中我们唯一需要做的就是增加奇数。然后在循环之后,我们可以检查奇数的值,看看满足哪个条件。
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
odd = 3
if number == 2:
print('2')
print('3')
counter += 2
elif (number % 2) != 0:
while number % odd != 0 and odd < number:
odd += 1
if odd == number: # No divisor was found!
print(f'{number}.')
counter += 1
number += 1
请注意,我们正在“硬编码”被 2 (number % 2) != 0 整除,然后使用变量 odd 检查其他所有内容的整除性。如果我们从 2 而不是 3 开始奇数,我们就不必进行硬编码。
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
odd = 2
if number == 2:
print('2')
print('3')
counter += 2
while number % odd != 0 and odd < number:
odd += 1
if odd == number: # No divisor was found!
print(f'{number}.')
counter += 1
number += 1
当我们进行此更改时,我们还注意到我们找到了两次素数 2 和 3,因此我们可以删除它们的硬编码版本:
number = 2
limit = int(input('How many primes do you need: '))
counter = 0
while counter < limit:
odd = 2
while number % odd != 0 and odd < number:
odd += 1
if odd == number: # No divisor was found!
print(f'{number}.')
counter += 1
number += 1