码迷,mamicode.com
首页 > 其他好文 > 详细

(原)pat1007素数猜想

时间:2015-06-05 17:23:20      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

---恢复内容开始---

1007. 素数对猜想 (20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。

输入样例:
20
输出样例:
4

1:素数就是我们常说的质数,就是智能能被1和本身整除的数,判断一个数是不是素数最简单的方法就是枚举,即将n 除2 ~ n - 1的数如果存在存在一个数能整除,就不是素数,不过这个算法效率太低,改进一下,

2:根据一个合数的因子,不会大于sqrt(n)n的开方这个定理,可以算出100000以内的素数,再大不是算不出来了而是需要等待很长时间,这样算法也就没什么意义了,

3:筛法求素数这个方法有个缺点,就是需要额外的空间去存储,首先我们要创建一个数组大小为 n + 1,boolean primer[n + 1],初始全为True,每次去最小的素数,然后把在数组 为其倍数的元素筛选掉,这里我们置为false

例如:0 ~ 30这几个数

第一个素数为2 我们筛选掉 4 6 8 10 12 14 16 18 20 22 24 26 28 30

第二个素数为3 我们筛选掉9 15 21 27

.......

直到找出全部素数

 

第二种方法的python代码实现:

这里我还遇到一个问题这就涉及到代码的组织方式

如果把13行的代码改为

while i * i < n:

  i = i + 1

这样在oj上提交就不能通过,

这是一个值得我自己思考的问题,如果因为代码本身造成的算法效率流失只能说明,是自己的无能了。

 1 #!/usr/bin/env python3
 2 __author__ = chao
 3 import math
 4 
 5 
 6 def isprimer(n):
 7     if n < 2:
 8         return False
 9     if n == 2:
10         return True
11     i = 2
12     temp = math.sqrt(n)
13     while i < temp:
14         i += 1
15         if  n % i == 0:
16             return False
17     return True
18 
19 
20 def nofprimer(n):
21     count = 1
22     i = 1
23     if n < 3:
24         return 0
25     if n == 3:
26         return 1
27     while True:
28         temp = 6 * i + 1
29         temp2 = temp - 2
30         if temp <= n:
31             if isprimer(temp) and isprimer(temp2):
32                 count += 1
33         else:
34             break
35         i += 1
36     return count
37 
38 if __name__ == "__main__":
39     n = input()
40     n = int(n)
41     print(nofprimer(n))

第三种方法代码实现:

import math

p_array = [True]
p_array = [True] * (10000000+1)


def isprimer(n):
    p_array[0] = False
    p_array[1] = False
    if (n < 2):
        return
    i = 2
    while i < n:
        if p_array[i]:
            j = 2
            temp = i * j
            while temp <= n:
                if p_array[temp]:
                    p_array[temp] = False
                j += 1
                temp = i * j
        i += 1
    return

def count_primer(n):
    count = 1
    if n < 5:
        return 0
    if n == 5:
        return count
    i = 1
    while True:
        temp1 = 6 * i - 1
        temp2 = temp1 + 2
        if temp2 > n:
            break
        if p_array[temp1] and p_array[temp2]:
                count += 1
        i += 1
    return count

if __name__ == "__main__":
    n = input()
    n = int(n)
    isprimer(n)
    print(count_primer(n))

刚学python练练手代码还不够规范

 

(原)pat1007素数猜想

标签:

原文地址:http://www.cnblogs.com/code-changeworld/p/4555024.html

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