我想测试用户输入的数字中的每个数字是否为质数。例如: 对于输入的数字,例如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")
答案 0 :(得分:0)
不是最好的方法。一段时间后将其删除,但可能有助于调试您的问题。有很多错误(逻辑错误),所以我认为这可能会助您一臂之力。可能会有更多我自己没有测试过的内容,过一会儿就会删除。看看我只修改了您的代码。
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数字定义一个字典。会更有效
答案 1 :(得分:0)
此循环存在多个问题:
for j in range(2,lst[i]-1):
if lst[i]%j==0:
primeflag=False
else:
primeflag=True
第一个问题是您一次又一次地替换primeflag
,因此最终这只是测试您检查的最后一个值是否是除数。您要想要检查的是任何个值是否是除数。因此,您需要在循环之前从True
开始,如果曾经将其设置为True
,则永远不要将其设置回False
:
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]
),但是您的预期输出似乎是 forward < / em>顺序(“ 1是素数2是素数4是一个合成数”),因此您可能要遍历lst[::-1]
。
将所有内容放在一起,并进行一些清理以适应PEP 8 style:
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")