繁体   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