来自projecteuler.net网站的练习题1

0.题目如下:

  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?

1.先理解什么是素数:

  质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数。

2.怎么判断是否是素数:

  方法一:在一般领域,对正整数n,如果用2到  之间的所有整数去除,均无法整除,则n为质数。

  方法二:1.解释一下代码第29行,在6的倍数两侧可能存在着素数,如:

          2 3 5 (6) 7 11 (12) 13 17 (18) 19 23 (24) 29 (30) 31 (36) 37 ......

         注意:在6的倍数两侧只是可能存在素数,不在6的倍数两侧就一定不是素数。

       2.方法二剩下的代码就是孪生素数的问题,自行百度吧

3.顺带提一下,最高效的办法是方法二。可以自行测试。

 1 import time
 2 #sqrt是开方
 3 from math import sqrt
 4 
 5 
 6 def check1(prime):
 7     if prime == 1:
 8         return False
 9     for i in range(2, int(sqrt(prime)) + 1):
10         if prime % i == 0:#能被除尽就不是素数
11             return False
12     return True
13 
14 #main1
15 # 在一般领域,对正整数n,如果用2到  之间的所有整数去除,均无法整除,则n为质数。
16 def main1(num):
17     prime = 0
18     x = 0
19     while x < num:
20         prime += 1
21         if check1(prime):
22             x += 1
23     return prime
24 
25 def check2(prime):
26     i = 5
27     if prime == 2 or prime == 3:
28         return True
29     if prime % 6 != 1 and prime % 6 != 5:
30         return False
31     while i <= sqrt(prime):
32         if prime % i == 0 or prime % (i + 2) == 0:#孪生素数 自行百度
33             return False
34         i += 6
35     return True
36 
37 #main2参考链接
38 #http://blog.youkuaiyun.com/huang_miao_xin/article/details/51331710
39 
40 def main2(num):
41     prime = 1
42     x = 0
43     while x < num:
44         prime += 1
45         if check2(prime):
46             x += 1
47     return prime
48 
49 
50 if __name__ == '__main__':
51     #给出两种解决的方法
52     start_time1 = time.time()
53     print(main1(10001))
54     print(time.time() - start_time1)
55     start_time2 = time.time()
56     print(main2(10001))
57     print(time.time() - start_time2)

 

转载于:https://www.cnblogs.com/my-times/p/7560942.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值