1013 数素数 (20)(20 分)
令P~i~表示第i个素数。现任给两个正整数M <= N <= 10^4^,请输出P~M~到P~N~的所有素数。
输入格式:
输入在一行中给出M和N,其间以空格分隔。
输出格式:
输出从P~M~到P~N~的所有素数,每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
问题很简单,判断素数,并输出。
但是使用常规的素数判断方法,有一项测试会出现超时。在前面1007 素数对猜想时也出现过这个问题,这次我们用上次使用的改进的素数寻找算法。
算法如下:
def prime(n,result):
flag = [1]*(n+2)
p=2
while(p<=n):
result.append(p)
for i in range(2*p,n+1,p):
flag[i] = 0
while 1:
p += 1
if(flag[p]==1):
break
该算法,是找出n以内的所有素数,并存放在result列表中。
该题的不同点在于,该题并未给出查找素数的具体范围,而是给出希望得到的素数个数。所以为了满足所有的测试用例,我们要给出一个合适的计算范围(n)。进过多次测试,得出将n设为200000可以满足所有测试用例。
为什么我们一定要用这个算法,而不改进单个素数的判断算法呢? 因为我不知道还能怎么改(哭笑)
程序:
def prime(n,result):
flag = [1]*(n+2)
p=2
while(p<=n):
result.append(p)
for i in range(2*p,n+1,p):
flag[i] = 0
while 1:
p += 1
if(flag[p]==1):
break
a = input().split()
result = []
prime(200000,result)
final = result[int(a[0])-1:int(a[1])]
if len(final)==1:
print(final[0])
else:
for i in range(len(final)-1):
if (i+1)%10==0:
print(final[i])
else:
print(final[i],end=" ")
if (i+2)%10==0:
print(final[i+1])
else:
print(final[i+1],end="")