Python判斷合數、質數
阿新 • • 發佈:2018-03-01
其他 編寫 pos 布爾 一個 pre 新的 序列 圖片
首先明確合數和質數的概念
合數:自然數中除了能被1和本身整除之外,還能被其他的數整除的數。(4,6,9,10...)
1 def heshu(m): 2 list_a = [] 3 for i in range(2,m+1): 4 for j in range(2,i): 5 if i % j == 0 : 6 list_a.append(i) #判斷i能否被(2,i)之間的數整除,能整除則為合數,添加到list中 7 break 8 print(list_a)9 heshu(20)
質數:大於1的自然數中除了能被1和本身整除之外,不能被其他的數整除的數。(2,3,5,7...)
1 def zhishu(m): 2 list_a = [] 3 for i in range(2,m+1): 4 flag = 0 5 for j in range(2,i): 6 if i % j == 0 : 7 flag = 1 #若i能被(2,i)之間的數整除,將flag置為1,跳出當前循環 8 break9 if flag == 0: 10 list_a.append(i) #執行完內層循環後,若flag未被置1,則表示i為質數,添加list 11 print(list_a) 12 zhishu(20)
Tips
由於剛開始使用python,對其內建函數還暫不了解,因此在進行代碼編寫的時候可能會較多的想到C的思路,總感覺代碼整體有些臃腫。
特別是在寫質數函數的時候,i % j == 0 是用來判斷合數的,但我們卻要輸出質數,因此想到用flag來對合數做標記以達到目的。
後來在別處看到使用filter()函數進行處理的方法,感覺這才符合python優雅 的特性嘛。。。
1 def zhishu2(num): 2 for i in range(2, num): 3 if num % i == 0: 4 return False 5 return True 6 new_list = list(filter(zhishu2,range(2,21))) 7 print(new_list)
filter()函數使用方法:
接收兩個參數,第一個為函數f(輸出布爾類型),第二個為序列ist,將list中的元素依次代入f中,根據函數中的判斷條件選擇返回True或者False,最後返回True的元素重新組成一個新的list。
當自己使用這個函數的時候,一開始是想直接打印出來:
new_list = filter(zhishu2,range(2,21)) print(new_list)
但是輸出卻有問題
又仔細看了下該函數的用法,發現這個filter函數輸出的應該是組成列表的元素,而不是直接一個列表,所以需要再將它轉化成列表:
new_list = list(filter(zhishu2,range(2,21))) print(new_list)
這樣就能正常的輸出了
Python判斷合數、質數