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

人生就有許多這樣的奇蹟,看似比登天還難的事,有時輕而易舉就可以做到,其中的差別就在於非凡的信念。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章