项目欧拉 #7 Python
我在写代码的时候遇到了一些麻烦。问题是:
“列出前六个质数:2, 3, 5, 7, 11 和 13,我们可以看到第六个质数是13。那么第10,001个质数是什么?”
这段代码看起来是这样的:
div = 10001
i = 2
count = 0
prime = 0
now = []
while count < div:
for x in range (2,i+1):
if len(now) ==2:
break
elif i%x == 0:
now.append(x)
if len(now)==1:
prime = i
count += 1
now = []
i+=1
print(prime)
我尝试了把除数设置为1000,结果还不错(用1000做除数我得到了7919)。但是,当我把除数设置为10001的时候,什么都没有得到,甚至没有错误提示。如果有人能帮帮我,我会非常感激。谢谢!
4 个回答
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。为了帮助大家更好地理解这些问题,下面是一些常见的情况和解决方法。
首先,确保你已经正确安装了所需的工具或库。有时候,问题的根源就是因为没有安装或者安装不正确。你可以查看官方文档,确认安装步骤是否都按照要求完成。
其次,检查你的代码是否有拼写错误或者语法错误。编程语言对这些错误非常敏感,哪怕是一个小小的错误也可能导致程序无法运行。仔细检查你的代码,确保每个单词和符号都正确无误。
另外,了解你使用的工具或库的版本也很重要。有时候,新的版本会引入一些变化,可能会导致以前的代码无法正常工作。查看更新日志,了解新版本的变化,必要时可以考虑使用旧版本。
最后,遇到问题时,不要害怕寻求帮助。可以在网上查找相关的解决方案,或者向其他编程爱好者请教。社区里有很多人愿意分享他们的经验和知识。
总之,编程是一项需要耐心和细心的工作,遇到问题时保持冷静,逐步排查,就一定能找到解决办法。
m=0
n=None
s=1
while s<=10001:
for i in range(1,m):
if m%i==0:n=i
if n==1:print(m,'is prime',s);s+=1
m+=1
只需对你的代码做一些简单的修改和简化,你就能在不到三分之一秒的时间内计算出你想要的数字。首先,正如@Hashman所建议的,我们只检查到平方根。接下来,我们只用奇数进行测试和除法,2这个特殊情况我们提前处理。最后,我们不再使用整个now
数组的长度逻辑,而是直接利用Python的break
逻辑:
limit = 10001
i = 3
count = 1
prime = 2
while count < limit:
for x in range(3, int(i ** 0.5) + 1, 2):
if i % x == 0:
break
else: # no break
prime = i
count += 1
i += 2
print(prime)
和之前一样,这样我们在限制为1000时得到7919,在限制为10001时得到104743。但这仍然没有筛法快。
试试这段代码:
prime_list = lambda x:[i for i in xrange(2, x+1) if all([i%x for x in xrange(2, int(i**0.5+1))])][10000]
print prime_list(120000)
在Python中,Lambda用来定义一个没有名字的函数,而xrange和range类似,都是用来定义一系列整数的。这个代码使用了列表推导式,遍历了数字两次,直到最终数字的平方根(也就是i**0.5)。如果某个数字是当前范围内某个数字的倍数,就把它排除掉。最后,你会得到一个按顺序排列的质数列表。所以,你只需要打印出对应索引的数字就可以了。
在编程中,有时候我们需要让程序能够处理一些特定的情况,比如用户输入错误或者程序运行出错。这时候,我们就会用到“异常处理”。简单来说,异常处理就是一种让程序在遇到问题时,不会直接崩溃,而是能够优雅地处理这些问题的方法。
想象一下,你在使用一个软件,突然出现了一个错误提示,而不是软件直接关闭。这个提示就是程序在处理异常时给用户的反馈。通过异常处理,程序可以捕捉到这些错误,并采取相应的措施,比如提示用户重新输入,或者记录错误信息以便后续分析。
在编程中,通常会使用一些特定的语法来实现异常处理。比如,在某些语言中,我们会用“try”和“catch”这样的关键词。你可以把“try”看作是“试试看”,而“catch”则是“抓住错误”。这样,当程序在“试”的过程中遇到问题时,就会被“抓住”,然后程序可以继续运行,而不是直接停止。
总之,异常处理就是让程序在遇到问题时能够更聪明地应对,而不是让用户感到困惑或失望。
# 7 10001st prime
import itertools
def is_prime(n):
for i in range(2, n//2 + 1):
if n % i == 0:
return False
else:
continue
return True
p = 0
for x in itertools.count(1):
if is_prime(x):
if p == 10001:
print(x)
break
p += 1