zoukankan      html  css  js  c++  java
  • PAT 数素数

    令 Pi 表示第 i 个素数。现任给两个正整数 M <= N <=104,请输出 PM 到 PN 的所有素数。

    输入格式:

    输入在一行中给出 M 和 N ,其间以空格分隔。

    输出格式:

    输出从 PM 到 PN 的所有素数,没 10 个数字占 1 行,但行末不得有多余空格。

    输入样例:

    5 27

    输出样例:

    11 13 17 19 23 29 31 37 41 43
    47 53 59 61 67 71 73 79 83 89
    97 101 103
    from math import sqrt
    def prime(x):
        k=int(sqrt(x))
        if x==0 or x==1:
            return False
        for i in range(2,k+1):
            if x%i==0:
                return False
                break
        return True
    s=2**17
    a=[]
    a.append(2)
    for i in range(1,s,2):
        if prime(i):
            a.append(i)
    # print(a)
    p=1
    x,y=map(int,input().split())
    for i in range(x-1,y):
        if p%10==0 or i+1==y:
            print(a[i])
        else:
            print(a[i],end = " ")
        p+=1
    # print(p)

    这道题目主要考查素数的筛选,要求挑出第 1 到 10000 个素数。这种挑选素数的方法就是直接根据定义去找,没有任何的优化,试了一下,第 10000 个素数是 104729 ,而恰好我写到 2 的 17 次方是 131072,这时我在牛客网提交刚好可以通过所有测试点,而在pta提交会有一个测试点通不过,所以,还是要优化一下,我又使用了普通筛选法(埃拉托色尼筛选法):

    import math
    b=2**18+1
    a=[0]*b
    c=[]
    for i in range(2,len(a)):
        a[i]=i
    for i in range(2,int(math.sqrt(len(a)))+1):
        if a[i]!=0:
            for j in range(i+i,len(a),i):
                a[j]=0
    for i in a:
        if i:
            c.append(i)
    p=1
    x,y=map(int,input().split())
    for i in range(x-1,y):
        if p%10==0 or i+1==y:
            print(c[i])
        else:
            print(c[i],end = " ")
        p+=1

    普通筛选法的基本思想就是素数的倍数一定不是素数,根据这个筛选法,pta就可以写到 2 的 18 次方了,因为我用了两个很大的列表,所以太大又会导致内存超限,反正,至少这个筛选法要比根据定义去筛选 1s 能多计算 130000 多的数据,还是不错的。

  • 相关阅读:
    tomcat 无法clean 的bug
    Open Type vs Open resource
    Cannot change version of project facet Dynamic Web Module to 2.4.
    股权稀释
    Java的各种打包方式
    记忆
    【转】给女儿的信
    买房费用
    工作职场
    装修-水电改造
  • 原文地址:https://www.cnblogs.com/andrew3/p/12625750.html
Copyright © 2011-2022 走看看