码迷,mamicode.com
首页 > 编程语言 > 详细

Python练习题 035:Project Euler 007:第10001个素数

时间:2016-10-29 01:40:19      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:论坛   class   ref   euler   复制   blank   http   lis   div   

本题来自 Project Euler 第7题:https://projecteuler.net/problem=7

# Project Euler: Problem 7: 10001st prime
# By listing the first six prime numbers:
# 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
# What is the 10 001st prime number?
# Answer: 104743

import time

def f(x):  #判断 x 是否为素数,返回bool值
    if x == 2:
        return True
    elif x <= 1:
        return False
    else:
        t = False  #判断是否能够整除
        for i in range(2, x//2):
            if x%i == 0:
                t = True
                break
        if t:  #若能整除
            return False
        else:
            return True

startTime = time.clock()  #计时开始
lst = []  #存放素数的列表
a = 1  #从数字 1 开始判断
while len(lst) < 10001:
    if f(a):
        lst.append(a)
    a += 1
endTime = time.clock()  #计时结束

print(‘第10001个素数为%s‘ % lst[-1])
print(‘耗时%.2f秒‘ % (endTime-startTime))  #计算耗时

求解第 10001 个素数。

上述代码的思路其实挺简单:首先自定义一个函数,用来判断某个数字是否为素数。之后从数字1开始判断,只要是素数,就放进 lst 列表,直到 len(lst) = 10001 为止,此时 lst[-1] 即为所求之数字。

思路应该没啥问题,但就是太费时间,总共用了将近 1 分钟!看了 Project Euler 论坛里,有人贴出了代码,说只花了 1.34 秒,但我复制过来一试,也是将近 1 分钟的耗时。或许是因为俺的计算机太烂???

另外,在判断是否为素数时,我一般是取 range(2, x//2),但看 Project Euler 论坛里有的人是用 range(2, int(math.sqrt(x))+1),计算次数是比我的少一些,但是……靠谱吗?

Python练习题 035:Project Euler 007:第10001个素数

标签:论坛   class   ref   euler   复制   blank   http   lis   div   

原文地址:http://www.cnblogs.com/iderek/p/6009787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!