我决定现在应该开始学习编码了。我对HTML和CSS有所了解,但我希望能够为iOS开发。我知道我还有很长的路要走,但我的目标是一步一步到达那里。
我正在通过iTunes U上的MIT Python课程进行学习,但仍无法完成作业。我理解枚举的概念,并测试所有可能的结果以找到素数,但是到目前为止,我所做的尝试未能使我失望。我最接近的尝试如下。
# counting confirmed primes. For loop should do remainder tests on
# all testNumbers, unless caught by the if statements that rule out
# multiples of 2,3,5,7 to speed things up. divisor increments by one
# on those numbers that do not get pulled by qualifying if statements
testNumber = 2
confirmedPrime = 0
while (confirmedPrime < 1001):
for divisor in range(1, testNumber+1):
if (testNumber/2)*2== testNumber:
testNumber += 1
elif (testNumber/3)*3 == testNumber:
testNumber += 1
elif (testNumber/5)*5 == testNumber:
testNumber += 1
elif (testNumber/7)*7 == testNumber:
testNumber += 1
elif(testNumber%divisor == 0):
testNumber += 1
confirmedPrime +=1
print testNumber
但是,这不会返回我期望的“ 7919”。它返回“ 7507”,因此在某处有一些复合材料通过网络滑落。
我已经在这个网站上搜寻并没有解决它,所以我想问一下。
最佳答案
这里有些地方不对,让我们逐步进行。
您首先要设置初始值,这是完全合理的。
testNumber=2
confirmedPrime = 0
然后进入一个while循环,继续直到变量
confirmedPrime
的值达到(即等于或大于)1001。我想您的任务是找到第1000个素数,但是这样做实际找到了1001st,因为while
循环一直持续到confirmedPrime
的值为1001。将其更改为while(confirmedPrime < 1000):
您立即进入另一个循环,这是第一个问题,即使这不是给您错误答案的原因。
for divisor in range(1, testNumber+1)
if (testNumber/2)*2 == testNumber:
...
对
for
循环内的2、3、5和7的乘法器进行测试没有任何意义,因为对于每个testNumber
值,您只需执行一次。因此,该部分测试应移出for循环。 if (testNumber/2)*2 = testNumber: # Why not use modulo here too for consistency?
testNumber += 1
elif ...
...
else:
for divisor in range(...):
下一部分将测试其他更大的除数。您正在测试1至
testNumber+1
范围内的除数。我不确定为什么要这样做,但这不是一个好主意,因为当您进行第二次迭代(测试testNumber%testNumber
)时,模测试始终会返回零。因此,您应该将其更改为testNumber-1
,实际上,当达到testNumber
的平方根时,您可以停止操作,但是我会留给您找出原因。现在出现了最大的问题:
for
循环完成后,将confirmedPrimes
递增1,而不实际检查是否找到素数。因此,仅当第一个测试都不为真且“除数测试”均不为真时,才增加confirmedPrimes
。使用下划线而不是mixedCase(这是不好的python mojo),一致的间距等进行了重写:
import math
test_number = 7 # Already know up to 7
confirmed_primes = 4 # Already know about 2, 3, 5 and 7
while confirmed_primes < 1000:
test_number += 1
if test_number % 2 and test_number % 3 and test_number % 5 and test_number % 7:
is_prime = True
for divisor in range(11, int(math.sqrt(test_number))+1):
if test_number % divisor == 0:
is_prime = False
if is_prime:
confirmed_primes += 1
print test_number