Python练习题 035:Project Euler 007:第10001个素数
本题来自 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 分钟的耗时。或许是因为俺的计算机太烂???
+++++++++++++++++++++++++++++++++++++++
【2016-10-30 更新】 在判断是否为素数时,我一般是取 range(2, x//2),但看 Project Euler 论坛里有的人是用 range(2, int(x**.5)+1),我试了下,发现基本可以把计算时间压缩到 1 秒钟之内,真是太方便了!更新代码如下:
# 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, int(x**.5)+1):
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
print('第10001个素数为%s' % lst[-1])
endTime = time.clock() #计时结束
print('耗时%.2f秒' % (endTime-startTime)) #计算耗时
其实,如果把 lst 的初始化改为 lst = [2],然后在判断是否为素数时,直接从 3 开始判断,且 a+= 2,似乎还能进一步压缩计算时间,但提升空间有限,所以……就不折腾了。
Python练习题 035:Project Euler 007:第10001个素数的更多相关文章
- Python练习题 008:打印101-200之间的所有素数
[Python练习题 008]判断101-200之间有多少个素数,并输出所有素数. ---------------------------------------------------------- ...
- Python3练习题 035:Project Euler 007:第10001个素数
import time def f(x): #判断 x 是否为素数,返回bool值 if x == 2: return True elif x <= 1: return False else: ...
- Python练习题 032:Project Euler 004:最大的回文积
本题来自 Project Euler 第4题:https://projecteuler.net/problem=4 # Project Euler: Problem 4: Largest palind ...
- Python练习题 029:Project Euler 001:3和5的倍数
开始做 Project Euler 的练习题.网站上总共有565题,真是个大题库啊! # Project Euler, Problem 1: Multiples of 3 and 5 # If we ...
- Python练习题 046:Project Euler 019:每月1日是星期天
本题来自 Project Euler 第19题:https://projecteuler.net/problem=19 ''' How many Sundays fell on the first o ...
- Python练习题 039:Project Euler 011:网格中4个数字的最大乘积
本题来自 Project Euler 第11题:https://projecteuler.net/problem=11 # Project Euler: Problem 10: Largest pro ...
- Python练习题 033:Project Euler 005:最小公倍数
本题来自 Project Euler 第5题:https://projecteuler.net/problem=5 # Project Euler: Problem 5: Smallest multi ...
- Python练习题 049:Project Euler 022:姓名分值
本题来自 Project Euler 第22题:https://projecteuler.net/problem=22 ''' Project Euler: Problem 22: Names sco ...
- Python练习题 048:Project Euler 021:10000以内所有亲和数之和
本题来自 Project Euler 第21题:https://projecteuler.net/problem=21 ''' Project Euler: Problem 21: Amicable ...
随机推荐
- CF1349A Orac and LCM 题解
题意分析 给出$n$个数,求这$n$个数两两的最小公倍数的最大公约数 思路分析 通过分析样例可以发现,如果要成为这$n$个数两两的最小公倍数的公约数,至少要是这$n$个数中$n-1$个数的约数,否则就 ...
- 力扣leetcode 435. 无重叠区间 - 贪心
非常经典的区间贪心思想 -- 详见博文: 贪心思想之区间贪心 本题给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] ...
- 【Gin-API系列】Gin中间件之鉴权访问(五)
在完成中间件的介绍和日志中间件的代码后,我们的程序已经基本能正常跑通了,但如果要上生产,还少了一些必要的功能,例如鉴权.异常捕捉等.本章我们介绍如何编写鉴权中间件. 鉴权访问,说白了就是给用户的请求增 ...
- Android Studio Eclipse运行时出现 finished with non-zero exit value 2 错误解决方法
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing Error:Ex ...
- vue项目打包上线发现 360 浏览器不兼容?
分享链接: 文档:解决vue 和 360 浏览器兼容问题.note链接:http://note.youdao.com/noteshare?id=41914c6dbb4238d765b26d59aa05 ...
- 在Mac上打开多个Unity实例
alias koa_unity="open -n /Applications/Unity\ 5.2.2/Unity.app" alias rob_unity="open ...
- php反序列化总结与学习
基础知识: 1.php类与对象 2.魔术函数 3.序列化方法 类与对象 <?php class test{ public $var = "hello world"; publ ...
- Oracle两个数据库互相访问-九五小庞
Oracle两个数据库互相访问
- Java8的日期时间处理
代码: package com.ufo.java8datetime; import java.time.Clock; import java.time.LocalDate; import java.t ...
- leetcode刷题-86分隔链表
题目 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1->4 ...