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

posted @ 2020-04-03 12:27  极限之旅  阅读(208)  评论(0编辑  收藏  举报