簡體   English   中英

測試一個數的每一位是否都是質數

[英]Test if each digit of a number is prime or not

我想測試用戶輸入的數字中的每個數字是否都是素數。 例如:對於像 124 這樣輸入的數字:1 是質數 2 是質數 4 是合數

我做了如下,但顯然這有一個錯誤。

x=int(input("Enter the number you want to check\n"))
primeflag=True
lst=[]
prime=[]
com=[]
while x>0:
    y=x%10
    x=x//10
    lst.append(y)

l=(len(lst))
for i in (0,l-1):
    for j in range(2,lst[i]-1):
        if lst[i]%j==0:
            primeflag=False
        else:
            primeflag=True
    if primeflag==True:
        prime.append(lst[i])
    else:
        com.append(lst[i])
print(prime,"are Prime Numbers")
print(com,"are Composite Numbers")

不是最好的方法 一段時間后將刪除,但可能有助於調試您的問題。 有很多錯誤(邏輯上的),所以我認為它可能會給你一個推動。 可能還有更多我自己沒有測試過,一段時間后會刪除。 看看我只修改了你的代碼。

x=list(input("Enter the number you want to check\n"))
primeflag=True
lst=[]
prime=[]
com=[]
lst=list(map(int,x))
l=(len(lst))
for i in range(0,l):
    primeflag=False
    print(lst[i])
    if(lst[i]==2 ):
        prime.append(lst[i])
        continue
    for j in range(2,lst[i]+1):
        if lst[i]%j==0:
            primeflag=False
        else:
            primeflag=True
    if primeflag:
        prime.append(lst[i])
    else:
        com.append(lst[i])
print(prime,"are Prime Numbers")
print(com,"are Composite Numbers")

包裝一個函數或其他東西,並在迭代列表時調用它。 但坦率地說,您可以為 0-9 數字定義一個 dict 是否具有狀態素數。 效率會更高

這個循環有多個問題:

for j in range(2,lst[i]-1):
    if lst[i]%j==0:
        primeflag=False
    else:
        primeflag=True

第一個問題是你primeflag遍地替換primeflag ,所以最終這只是測試你檢查的最后一個值是否是除數。 檢查的是是否有任何值是除數。 因此,您需要在循環之前以True開始,並且如果您曾經將其設置為False ,則永遠不要將其設置回True

primeflag=True
for j in range(2,lst[i]-1):
    if lst[i]%j==0:
        primeflag=False

當我們在做的時候,一旦你找到一個因子,你就可以break ,因為你已經知道這個數字是合數:

primeflag=True
for j in range(2,lst[i]-1):
    if lst[i]%j==0:
        primeflag=False
        break

第二個問題是range(2,lst[i]-1)是所有數字,但不包括lst[i]-1 范圍在 Python 中是半開放的。 所以:

primeflag=True
for j in range(2, lst[i]):
    if lst[i]%j==0:
        primeflag=False
        break

盡管這是錯誤的,但實際上並沒有破壞任何東西。 為什么? 好吧,您實際上只需要測試sqrt(lst[i])) ,並且由於不同的錯誤,您已經得到 0、1 和 2 錯誤,並且對於每個更大的數字, n-1 > sqrt(n) ,所以你錯過n-1並不重要。

但是,您的外循環有同樣的問題:

for i in (0,l-1):

……在那里,這一個問題——你永遠不會檢查最后一位數字。


第三個問題是,對於數字 0、1 和 2, range(2, lst[i])是空的,所以你根本不會循環。 對於您的原始代碼,這意味着您將只使用最后一位數的primeflag的剩余值。 通過上面的修復,這意味着您將假設所有這三個都是素數,這適用於 1(根據您的定義)和 2,但不適用於 0。最簡單的修復是:

primeflag = lst[i] != 0
for j in range(2, lst[i]):
    if lst[i]%j==0:
        primeflag=False
        break

但實際上,一旦我們隱含地輸入了 0、1 和 2 的硬編碼答案,為什么不 (a) 明確表示,以及 (b) 輸入所有 10 位數字的答案? 然后你可以跳過整個循環,你不會有所有這些機會把事情放在首位:

primeflag = lst[i] in {1, 2, 3, 5, 7}

最后,您可以通過直接循環數字來簡化循環,而不是循環數字列表長度的范圍 - 這再次使事情變得更簡單,並消除了出錯的機會之一(導致你錯過了最后一位數字):

for digit in lst:
    if digit in {1, 2, 3, 5, 7}:
        prime.append(digit)
    else:
        com.append(digit)

最后一件事:您的代碼以相反的順序生成數字(例如,輸入124為您提供[4, 2, 1] ),但您的預期輸出似乎是按正向順序排列的數字(“1 是質數 2是質數 4 是合數”),因此您可能需要遍歷lst[::-1]

把它們放在一起,稍微整理一下以適應PEP 8 風格

x = int(input("Enter the number you want to check\n"))
lst = []
while x:
    y = x%10
    x = x//10
    lst.append(y)

prime, com = [], []
for digit in lst[::-1]:
    if digit in {1, 2, 3, 5, 7}:
        prime.append(digit)
    else:
        com.append(digit)

print(prime, "are Prime Numbers")
print(com, "are Composite Numbers")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM