Python判斷合數、質數


首先明確合數和質數的概念

合數:自然數中除了能被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)

這樣就能正常的輸出了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM