[英]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.