用Python判斷質數的嘗試

2021-01-14 寶少來了

周末開始Python的循環語句學習,於是就想到了一個經典的問題,尋找質數。這是第一次寶少用程序來解決實際的應用問題,看看會有什麼結果。

我們的目標是:輸入一個數字之後,讓計算機判斷它是不是質數。

拋出問題後,首先需要解決,什麼是質數的問題。與純數學的想法不同,我們需要找到一個可以讓計算機接受的判定的法則。

質數,就是除了1以及本身以外,沒有其他因數的自然數。首先它是個自然數,因此程序的輸入端就解決了,N=int(input())。

重要的是判定的法則,沒有其他因數又可以表述成什麼呢?於是,要從簡單的數字舉例開始。問如何判定117是不是質數呢?我們會考慮分解117。

分解的過程其實是將這個數逐個地去試驗性除以2、3、5、……,只要能被整除,那麼就不是質數,如果一直找不到可以整除的數,那麼就是質數。

於是,寫出代碼如下:

N=int(input())
for i in range (2,N):
if N % i ==0:
print(N,"不是質數")
break
else:
print(N,"是質數")


運行結果正常,好像能夠判斷輸入的數字了。

那麼這裡有什麼可以改進的地方呢?

問題一:很明顯,如果輸入的數字是「1」的話,這個程序會輸出:1是質數。因此可以在前面進行輸入數字的判斷。

問題二:在數學上,進行質數判斷的計算,不會一直算到N-1這個數,只會算到N/2。因為除「1」以外,2是最小的因子了。

如果N,能夠找到大於N/2的因子的話,那麼另外一個因子就會小於2,這是不可能存在的。因此在循環的時候,我們計算到N/2就夠了,在程序運行上講,可以節省很大的運行時間。這在程序設計上是非常必要的。

通過這兩個分析,改進程序如下:

N=int(input())
if N>1:
for i in range (2,N//2+1):
if N % i ==0:
print(N,"不是質數")
break
else:
print(N,"是質數")
else:
print(N,"不是質數")

程序運行後,在輸入較大的數字時,運行的效率還是有提升的。
講完這些,想到了一道以前程序競賽的題目:輸入一串數字,請判斷出其中有多少個質數。

很明顯,這裡的實質問題還是要判斷輸入的一串數字裡面,每個數字是不是質數,然後還需要計數。因此,判斷質數的程序已經實現了,接下去是要解決輸入一串數字,然後逐個判斷,以及如何計數的問題。
數字需要一個一個放進去檢驗,然後出來一個結果,很容易想到使用一個函數定義的形式。
這裡我們定義了一個叫做judge的函數,判斷是否是質數,如果是質數,就把標記flag標記為「1」,不是則標記為「0」。同時,這樣也可以方便後面進行計數。

def judge(Num):
if Num > 1:
for i in range(2, Num // 2 + 1):
if Num % i == 0:
flag=0
break
else:
flag=1
else:
flag=0
return flag


N=int(input())
count=0
count=count+judge(N)
print("總共有",count," 個質數")

但是很明顯,這裡只能輸入一個數字,那麼如何進行多個數字的輸入呢?或者如何輸入一行用空格分隔的數字,再進行判斷有幾個質數呢?
要存入一串數字,很容易想到使用數組的概念。因為在scratch裡接觸過列表,所以這個還比較容易理解。然後,因為有空格,我們需要用split函數進行分割。

a=input()
N=[int(n) for n in a.split()]
l=len(N)
count=0
for i in range (l):
count=count+judge(N[i])
print("總共有",count," 個質數")

這裡涉及到後續數組的知識,以及split函數,只跟他講了一下大概,能夠看懂這個程序就可以了。

相關焦點

  • Python中判斷數字是否為質數的實例講解
    在本篇文章裡小編給大家分享了關於python中判斷數字是否為質數的實例講解內容,有興趣的朋友們可以學習下。
  • 如何用java判斷一個數是不是質數?
    昨天分享了怎麼判斷一個數是不是迴文數,目的是為了鞏固一下if選擇語句和求餘數運算符,今天分享一下怎麼判斷一個數是不是質數,可以鞏固for循環、if選擇語句、還有沒怎麼使用過的基本數據類型Boolean。思路:首先要知道的質數的概念是什麼。
  • Python編程案例:判斷自然數n是質數還是合數
    編程需求阿萌要開發一個程序,該程序可以判斷一個自然數n是質數還是合數。例如學生輸入自然數17,程序判斷17為質數,程序輸出「15:質數」。認識質數和合數要確定一個自然數是質數還是合數,需要先找出該自然數有多少個因數。因為該自然數是質數還是合數,與這個自然數有多少個因數有關。按這些數因數個數的多少,可以分為三種情況:只有1和它本身兩個因數的為質數,質數也稱為素數。
  • 少兒編程Python第4課-for循環語句(質數判斷)
    本課程用的都是Python 3.x 。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。質數在實際生活中的應用很廣泛:質數被利用在密碼學上,所謂的公鑰就是將想要傳遞的信息在編碼時加入質數,編碼之後傳送給收信人,任何人收到此信息後,若沒有此收信人所擁有的密鑰,則解密的過程中(實為尋找素數的過程),將會因為找質數的過程(分解質因數)過久,使即使取得信息也會無意義。
  • 雲計算開發學習實例:Python3 質數判斷方法
    一個大於1的自然數,除了1和它本身外,不能被其他自然數(質數)整除(2, 3, 5, 7等),換句話說就是該數除了1和它本身以外不再有其他的因數。執行以上代碼輸出結果為:延伸在判斷一個大數是質數還是合數的情況下,應該在查看因子那裡的循環中使用到平方根。
  • Python語言程序設計筆記——第四周圓周率計算,質數求和
    \ 4/(8*k+1) – 2/(8*k+4) - \ 1/(8*k+5) – 1/(8*k+6))print("圓周率值是: {}".format(pi))>>>圓周率值是: 3.141592653589793python
  • 如何快速判斷一個自然數是質數
    在大於1的自然數中除了1和這個數本身外,沒有其他因數的數稱為質數。質數也叫素數。除了2以外,所有的質數全部都是奇數。
  • 教程資源|判斷質數和合數程序
    在數學中經常會看到質數和合數,但很多人卻不知道什麼是質數,什麼是合數?根據算術基本定理,每一個比1大的整數,要麼本身是一個質數,要麼可以寫成一系列質數的乘積;而且如果不考慮這些質數在乘積中的順序,那麼寫出來的形式是唯一的,最小的質數是2。質數又稱素數,個數是無窮的,一個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的因數。
  • 趣味編程-數學篇-判斷質數
    問題描述:判斷一個自然數是否為質數。
  • 如何判斷一個正整數是否為質數的三種方法 | 附Python程序
    2008年8月,美國加州大學洛杉磯分校(UCLA)的計算機專家史密斯(E.Smith)通過參加了一個名為「網際網路梅森素數大搜索」(GIMPS)的國際合作項目,發現了第46個也是當時最大的梅森素數 2^43112609-1,該素數也就是 2 自身相乘43112609次減1,它有 12978189 位數,如果用普通字號將這個巨數連續寫下來,它的長度可超過50公裡!
  • 100以內質數的快速判斷方法
    對於30以內質數,大部分老師都會要求學生記憶,所以瞬間就可以判斷,但對於100以內任意自然數,如何快速判斷它是否是質數呢?其實只要掌握正確的方法,不需要任何專門的訓練,都可以在3秒內判斷出來。一、首先要明確質數的意義質數和合數是根據因數的個數來分類的,質數只有2個因數,合數至少有3個因數。二、探究判斷質數的方法課本例1提供了一個方法,依次劃掉某些數的倍數,把不是質數的都排除了,剩下的就都是質數。
  • 如何快速判斷149與281是否為質數,判斷過程最關鍵
    昨天我們說了質數的一些特點。其中也講到了一點,怎樣快速判斷一個自然數是否是質數?當然這個數字不能太大,1000以內還是相對比較快能判斷出來。採用的方法是找到小於並且最接近這個自然數的完全平方數。用我們要檢驗的這個數除以該完全平方數的平方根以內的質數。我們舉個簡單的例子,149是不是質數?如果我們直接這樣看的話,可能肯定是看不出來的。那如果從2開始一直往上,一個數一個數試,(據說電腦是這麼判斷的,直到試到這個數本身為止),我們也不知道具體要試到哪個數為止才不至於遺漏?
  • 小學數學題,判斷3599是質數還是合數,這兩種方法你覺得哪種好用
    但一個大於100的自然數,我們如何判斷它是否為質數呢?最直接的方法就是試除。但是我們也不是從2開始每個數都去試下,這樣效率太低,自己心裡也沒數到底要試到哪個數才算結束?總不至於說一直試到那個數本身吧。至於怎麼判斷,在專欄《小學基礎數論》裡有相關文章介紹。大家也可以參考一下這個視頻,判斷3599是否為質數?
  • 怎樣判斷一個數是質數還是合數?
    我們先從五年級上學期初識質數開始說起。一:什麼是質數?質數:一個數,如果只有1和它本身兩個因數,這樣的數叫做質數。 如:5,11,19(在非零自然數範疇研究)合數:除了1和它本身以外還有其他因數的數。每個合數都可以由幾個質數相乘得到。例:30=2×3×5120=2×2×2×3×5三:怎樣判斷一個數是質數還是合數?例:103是不是質數?247呢?通常情況下遇到這種問題,同學們都會拿質數從小到大挨個試。
  • 數學小知識 | 判斷質數的方法
    自古以來,數學家們就想弄明白:自然數中到底有多少個質數,質數的分布有什麼規律,如何去尋找質數。那麼,如何讓利用辛答拉姆篩法尋找質數呢,方法如下:(1)如果M在數表中,那麼 2M+1 一定不是質數,例如,M=4 在數表中,2M+1=9,9不是質數;M=17在數表中,2M+1=35,35不是質數。
  • ghpython_分解質因數
    今天咱們繼續來看老潘微博裡的一個python小案例,將一個合數分解質因數,我記得以前中學課本裡,咱們用的是短除法來做,就是用合數依次去除以每一個質數,將能被整除的質數記錄下來,最後將合數轉化為多個質數相乘的形式,就為分解質因數。今天咱們來看看用python怎麼做。
  • 質數與合數的暢想
    理解質數和合數的概念,並能判斷一個數是質數還是合數,會把自然數按因數的個數進行分類。2. 通過自主探究、合作交流的方法,理解質數和合數的意義,經歷概念的形成過程。3. 提升自主探索、獨立思考、合作交流的能力, 充分展示數學的魅力。
  • 小升初奧數天天練數論——質數合數的判斷
    北京奧數網訊 智康1對1付金海老師每日提供奧數天天練試題供咱們小升初的孩子練習,今日發布數論——質數合數的判斷。     點擊進入:奧數天天練   考點:質數合數的判斷     難度:2星   題目:康康最近遷居了,康康驚奇地發現他們新居的門牌號碼是四位數.同時,他感到這個號碼很容易記住,因為它的形式為
  • 如何快速地判斷一個整數是不是質數,這種簡便方法必須掌握
    正整數則可根據因數個數來劃分,可分為1、質數與合數。我們說如果一個正整數只有1和它本身是兩個正因數,那麼這樣的數就稱之為質數。質數也叫做素數,可以說它是數字的根源。如果沒有質數,或許就沒有數論什麼事了。如果用字母表示:a=1×a。(a為大於1的自然數)。
  • 如何快速判斷一個自然數是不是質數,除了試除法外還有更好的方法
    在大於1的自然數中除了1和這個數本身外,沒有其他因數的數稱為質數。質數也叫素數。除了2以外,所有的質數全部都是奇數。如果能記住100以內的質數,對於以後在做一些較大數字的分解質因數,有非常大的幫助。100以內有多少個質數呢?總共有25個。大家可以看一下100以內質數表。