代碼如下: (具體內置函數可以自行搜索,我主要記錄這樣求素數的原理即好處,幫助大家和自己體驗一下這種高級的感覺【來自小白的樂趣】)
1 maxNumber = int(input("請輸入一個大於2的自然數")) 2 lst = list(range(2, maxNumber)) 3 print(lst) 4 # 最大整數的平方根 5 m = int(maxNumber ** 0.5) 6 for index, value in enumerate(lst): 7 8 # 如果當前數字已大於最大整數的平方根,結束判斷(素數判斷方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。) 9 if value > m: 10 break 11 # 對該位置之后的元素進行過濾,每次除以value,若余數為0,則淘汰它 12 lst[index + 1:] = filter(lambda x: x % value != 0, lst[index + 1:]) 13 print("lst:",lst) 14 print(lst)
原理:
前提須知:
素數判斷方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。
舉例 使用36來跑跑上面的代碼
lst = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
m = 6
進入循環
① index = 0 value = 2(對應lst中的第一個元素)
從lst[1]開始進行過濾 找出lst里不能被2整除的數
lst = [2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35]
② index =1 value = 3(對應lst中的第二個元素)
從lst[2]開始進行過濾 找出lst里不能被3整除的數
lst = [2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35]
③ index = 2 value = 5 (對應lst中的第三個元素)
從lst[3]開始進行過濾 找出lst里不能被5整除的數
lst = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
④ index = 3 value = 7
此時已經大於6(36的平方根),所以結束判斷
相比從2到所求數的平方根進行遍歷,通過是否能被整除來求素數,這個的循環次數更少,譬如從上述②到③,就已經省去了對是否能整除4的判斷,若我們所求的數越大,那這個體現的效率就越高(因為能減少更多的運算次數),為什么可以這樣呢?如果一個數不能被2整除,那它肯定不能被4整除(即不能被n整除的數,肯定不能被n的倍數整除),因此就可用這規律減少運算次數