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