我知道也许使用“for”代码可能会很清楚,但我想了解为什么这段代码不起作用。此外,该代码是对 2008 年 MIT OCW 课程练习的改编,其中允许使用的唯一函数是算术函数,if、elif、else、print 和 while。需要指出的是,代码应该打印出前 1000 个素数。
print '2, ' #Print the prime 2 to set only odd primes.
primesofar=3 #Set 3 as the first prime
primecounter=1 #Mark 3 as the first prime to test until 1000, otherwise the while below should test to 1001
primesupport=1 #Create primesupport with a integer value
while primecounter<1000:
primesupport=primesofar/2 #Create a support counter for test the prime. This counter only had to have the half value of the supposed prime, because we only need to try to divide by the primes that are lower than the half of the suppposed prime. In fact it would be better to test for values that are lower than the square root of the supposed prime, but we can't use square root operation yet.
while primesupport>0:
if primesofar%primesupport == 0:
primesupport=-1 #If the remainer of the division is 0, the number isn't prime because it will have more than two divisors so we set primesupport as -1 to exit the while and increase the current primesofar to the next odd number.
primesofar=primesofar+2
elif primesupport==1: #If primesupport is 1, we tested all the numbers below the half of the supposed prime which means the number is prime. So we print it, set the while exit and increase the number of primes counted and go to the next odd number.
print primesofar+', '
primesofar=primesofar+2
primesupport=-1
primecounter=primecounter+1
else:
primesupport=primesupport-1
感谢您的快速响应,现在我认为代码中可能存在我看不到的中断。因此,我将尝试写下我认为代码应该执行的操作,以便您更容易指出我在哪里犯了错误。让我们开始吧:primesofar 收到 3;primecounter 接收 1 并且 primesupport 接收 1。第一个 while 测试 primecounter 并且由于 primesupport 小于 1000,它进入循环。然后,primesupport值变为1,因为3/2=1 由于primesupport大于0,进入第二个while循环。if 条件为真(3%1=0)所以代码输入 if,将 primesupport 更改为 -1 并将 primesofar 增加 2。(现在 primesupport=-1 和 primesofar=5)这里有问题,因为它离开不打印 3,但让我们继续。当它返回到第二个 while 时,它将收到一个 False,因为 -1 不大于 0。这将使代码测试第一个 while,并且由于 primecounter 没有更改,它将再次进入循环。Primesupport 现在将收到 2(因为 5/2=2)它将进入第二个循环并通过所有循环,直到出现 else 条件。Primesupport 将减一(primesupport now =1),while 循环将继续进入 elif。这将打印 5 增加 primesofar 到 7 减少 primesupport 以离开 while 循环并增加 primecounter,回到第一个循环并重新开始。我承认,除了没有按预期打印的 3 之外,我看不出我在哪里犯了错误。希望你能指出我。这将使代码在第一个 while 中进行测试,并且由于 primecounter 没有更改,它将再次进入循环。Primesupport 现在将收到 2(因为 5/2=2)它将进入第二个循环并通过所有循环,直到出现 else 条件。Primesupport 将减一(primesupport now =1),while 循环将继续进入 elif。这将打印 5 增加 primesofar 到 7 减少 primesupport 以离开 while 循环并增加 primecounter,回到第一个循环并重新开始。我承认,除了没有按预期打印的 3 之外,我看不出我在哪里犯了错误。希望你能指出我。这将使代码在第一个 while 中进行测试,并且由于 primecounter 没有更改,它将再次进入循环。Primesupport 现在将收到 2(因为 5/2=2)它将进入第二个循环并通过所有循环,直到出现 else 条件。Primesupport 将减一(primesupport now =1),while 循环将继续进入 elif。这将打印 5 增加 primesofar 到 7 减少 primesupport 以离开 while 循环并增加 primecounter,回到第一个循环并重新开始。我承认,除了没有按预期打印的 3 之外,我看不出我在哪里犯了错误。希望你能指出我。Primesupport 现在将收到 2(因为 5/2=2)它将进入第二个循环并通过所有循环,直到出现 else 条件。Primesupport 将减一(primesupport now =1),while 循环将继续进入 elif。这将打印 5 增加 primesofar 到 7 减少 primesupport 以离开 while 循环并增加 primecounter,回到第一个循环并重新开始。我承认,除了没有按预期打印的 3 之外,我看不出我在哪里犯了错误。希望你能指出我。Primesupport 现在将收到 2(因为 5/2=2)它将进入第二个循环并通过所有循环,直到出现 else 条件。Primesupport 将减一(primesupport now =1),while 循环将继续进入 elif。这将打印 5 增加 primesofar 到 7 减少 primesupport 以离开 while 循环并增加 primecounter,回到第一个循环并重新开始。我承认,除了没有按预期打印的 3 之外,我看不出我在哪里犯了错误。希望你能指出我。回到第一个循环并重新开始。我承认,除了没有按预期打印的 3 之外,我看不出我在哪里犯了错误。希望你能指出我。回到第一个循环并重新开始。我承认,除了没有按预期打印的 3 之外,我看不出我在哪里犯了错误。希望你能指出我。
感谢大家的帮助,特别是 FallenAngel、John Machin、DiamRem 和 Karl Knechtel 指出错误并展示了调试方法。