使用Python查找第n个素数的枚举
我已经决定是时候开始学习编码了。我有一些HTML和CSS的知识,但我希望能够为iOS开发。我知道我还有很长的路要走,但我的目标是一步一步地到达那里 我正在iTunes U上完成麻省理工学院Python课程,我被家庭作业困住了。我理解枚举的概念,并测试每一个可能的结果以找到素数,但是我迄今为止的尝试失败了。我最近的尝试如下使用Python查找第n个素数的枚举,python,loops,primes,enumeration,Python,Loops,Primes,Enumeration,我已经决定是时候开始学习编码了。我有一些HTML和CSS的知识,但我希望能够为iOS开发。我知道我还有很长的路要走,但我的目标是一步一步地到达那里 我正在iTunes U上完成麻省理工学院Python课程,我被家庭作业困住了。我理解枚举的概念,并测试每一个可能的结果以找到素数,但是我迄今为止的尝试失败了。我最近的尝试如下 # counting confirmed primes. For loop should do remainder tests on # all testNumbers, un
# 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
#计算已确认的素数。For循环应该在
#所有TestNumber,除非被排除在外的if语句捕获
#2,3,5,7的倍数来加快速度。除数增加1
#在那些没有通过限定if语句提取的数字上
testNumber=2
confirmedTime=0
而(确认时间<1001):
对于范围(1,testNumber+1)中的除数:
如果(测试编号/2)*2==测试编号:
testNumber+=1
elif(测试编号/3)*3==测试编号:
testNumber+=1
elif(测试编号/5)*5==测试编号:
testNumber+=1
elif(测试编号/7)*7==测试编号:
testNumber+=1
elif(testNumber%除数==0):
testNumber+=1
确认时间+=1
打印测试编号
然而,这并没有返回我期望的“7919”,但是。它返回“7507”,所以在某个地方有一些复合材料从网中滑过
我已经搜索了这个网站,但没有解决它,所以我想我会问一下。这里有一些问题,所以让我们一步一步来 首先设置初始值,这是非常合理的
testNumber=2
confirmedPrime = 0
然后进入while循环,直到变量confirmedTime
的值达到(即等于或大于)1001为止。我假设您的任务是找到第1000个素数,但这样做实际上就是找到第1001个素数,因为while
循环一直持续到confirmedTime
的值为1001。换成
while(confirmedPrime < 1000):
在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
循环完成后,将confirmedTime
增加1,而不实际检查是否找到素数。因此,只有在第一个测试都不为真且“除数测试”都不为真的情况下,才会增加确认时间
使用下划线而不是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
导入数学
测试编号=7#已知道最多7个
已确认的素数=4#已经知道2、3、5和7
当确认_素数<1000时:
测试编号+=1
如果测试单元编号%2和测试单元编号%3和测试单元编号%5和测试单元编号%7:
_prime=True吗
对于范围(11,int(math.sqrt(test_number))+1中的除数:
如果测试数%除数==0:
素=假吗
如果是_素数:
已确认的_素数+=1
打印测试编号
这里有一些位不正确,所以让我们一步一步走
首先设置初始值,这是非常合理的
testNumber=2
confirmedPrime = 0
然后进入while循环,直到变量confirmedTime
的值达到(即等于或大于)1001为止。我假设您的任务是找到第1000个素数,但这样做实际上就是找到第1001个素数,因为while
循环一直持续到confirmedTime
的值为1001。换成
while(confirmedPrime < 1000):
在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
循环完成后,将confirmedTime
增加1,而不实际检查是否找到素数。因此,只有在第一个测试都不为真且“除数测试”都不为真的情况下,才会增加确认时间
使用下划线而不是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
导入数学
测试编号=7#已知道最多7个
已确认的素数=4#已经知道2、3、5和7
当确认_素数<1000时:
测试编号+=1
如果测试单元编号%2和测试单元编号%3和测试单元编号%5和测试单元编号%7:
_prime=True吗
对于范围(11,int(math.sqrt(test_number))中的除数+1