1. 程式人生 > >Python判斷合數、質數

Python判斷合數、質數

其他 編寫 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                 break
9 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判斷合數、質數