来自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.csdn.net/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)

 

posted @ 2017-09-20 13:17  人生入戏  阅读(177)  评论(0编辑  收藏  举报