测试数字的每个数字是否为质数

时间:2018-08-28 20:54:49

标签: python

我想测试用户输入的数字中的每个数字是否为质数。例如: 对于输入的数字,例如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")

2 个答案:

答案 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")