version1:
有一个测试点运行超时,与B1007类似,问题出在素数判断耗时过多
要点:
- 素数判断
- 统计第M个素数及第N个素数之间的素数(两个变量:num遍历数字判其是否为素数,cnt用于素数统计计数)
- 按格式输出
import math
def isPrime(n):
if n <= 1:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
M, N = map(int, input().split())
d = []
num = 2
cnt = 0
while cnt < N:
if isPrime(num):
cnt += 1
if cnt >= M:
d.append(num)
num += 1
count = 1
for num in d:
if count % 10 != 0 and count != len(d):
print(num,end=' ')
count += 1
elif count == len(d):
print(num)
else:
print(num)
count += 1
version2:
AC
与B1007相同的改进思路,这里不再赘述。
但这题还有一个注意点就是,具体的范围没有给出,如果随意指定范围,那么第四个测试点并不能通过。经过测试,指定范围为200000左右可以成功通过。
m, n = map(int, input().split())
t = 200000
flag = [1]*(t+2)
p = 2
primes = []
while p <= t:
primes.append(p)
for i in range(2*p, t+1, p):
flag[i] = 0
while 1:
p += 1
if flag[p] == 1:
break
result = primes[m-1:n]
for i, num in enumerate(result):
if (i+1) % 10 == 1:
print(num, end='')
else:
print(' ' + str(num),end='')
if (i+1)% 10 == 0:
print()