PAT-1013 数素数 (20分) Python3 (知识点:制表法素数的判定)

1013 数素数 (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


核心代码就是素数的判定:(使用制表法):
这个题如果没有用制表法,而是写一个函数去判定素数,这样就会超时。制表法就是利用数组这种,先将所有的数都标记为素数,然后以素数从小到大进行循环取倍数,看一下面的代码,基本就会了。素数大规模的判定时最好用这种方法,不会超时!

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

人生就有许多这样的奇迹,看似比登天还难的事,有时轻而易举就可以做到,其中的差别就在于非凡的信念。

发布了47 篇原创文章 · 获赞 50 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_45021180/article/details/104974469