1013 数素数 (20分)
令 Pi 表示第 i 个素数。现任给两个正整数 M≤N≤10^4 ,请输出 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
核心代码就是素数的判定:(使用制表法):
这个题如果没有用制表法,而是写一个函数去判定素数,这样就会超时。制表法就是利用数组这种,先将所有的数都标记为素数,然后以素数从小到大进行循环取倍数
,看一下面的代码,基本就会了。素数大规模的判定时最好用这种方法,不会超时!
MAX取值的一个坑:
这个题目如果MAX取得大一点就会超时,当时我就取MAX=1000001就超时了,我当时就很奇怪,我把MAX一步一步的变小
,最后才AC了!
# 素数判定核心代码,需要记住!!!
MAX=105001
pri=[]
for i in range(MAX): # 让所有的数先设为素数,下面进行筛选
pri.append(1)
pri[0]=pri[1]=0
for i in range(2,MAX):
if pri[i]==1:
P.append(i)
for j in range(2,MAX):
if i*j>=MAX:
break
pri[i*j]=0
AC正确代码:
MAX=105001
pri=[]
P=[]
for i in range(MAX): # 让所有的数先设为素数,下面进行筛选
pri.append(1)
pri[0]=pri[1]=0
for i in range(2,MAX):
if pri[i]==1:
P.append(i)
for j in range(2,MAX):
if i*j>=MAX:
break
pri[i*j]=0
m,n=map(int, input().split())
fg=1
for i in range(m-1,n):
print(P[i],end="")
if fg%10==0 or i==n-1:
print("")
else:
print(" ",end="")
fg+=1
人生就有许多这样的奇迹,看似比登天还难的事,有时轻而易举就可以做到,其中的差别就在于非凡的信念。