zoukankan      html  css  js  c++  java
  • (原)pat1007素数猜想

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

    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练练手代码还不够规范

  • 相关阅读:
    k8s资源需求和限制, 以及pod驱逐策略
    python转义引起的错误
    nginx location 匹配目录
    kubelet 证书自动续期
    docker常见退出码
    (转)firefox火狐浏览器语言设置
    去掉表的identity属性
    SQL Server内存方面知识收集
    SQL Server 中not in和not exists
    Data Compression(1)
  • 原文地址:https://www.cnblogs.com/code-changeworld/p/4555024.html
Copyright © 2011-2022 走看看