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 多的数据,还是不错的。

  • 相关阅读:
    Direct3D 11的Device接口和DeviceContext接口
    设计模式13---设计模式之观察者模式(Observer)(行为型)
    codeforces 166C Median
    【转载】uclibc和glibc的差别
    解决debian中脚本无法使用source的问题
    debian之samba服务器搭建
    对于刚刚踏入社会的 90 后毕业生,70 后和 80 后有什么建议?
    【转载】debian上快速搭建ftp
    【转载】关于Embedded Linux启动的经典问题
    系统移植手册
  • 原文地址:https://www.cnblogs.com/andrew3/p/12625750.html
Copyright © 2011-2022 走看看