Python - 检查列表中的数字是否是某个数的因子

3 投票
3 回答
13371 浏览
提问于 2025-04-15 20:25

我有一个数字列表(整数),比如说从1到10。

这些数字不一定是连续的,但它们是按从小到大的顺序排列的。

我让用户多次输入可用的数字选择。当用户输入一个数字后,这个数字会从列表中删除,同时它的所有因子也会被删除。

我已经阻止用户选择质数(只能被1和它自己整除的数字)。不过,有时候列表中可能会有非质数,但它们没有剩下的因子。

我对Python还比较陌生,所以在实现以下功能时遇到了一些困难:

  • 检查用户选择的数字是否没有剩下的因子(即使它不是质数)。

  • 检查列表中是否只剩下质数,或者没有因子的数字。

我在考虑使用for循环,但不太确定该怎么实现。有没有人能给我一些建议或代码?提前谢谢大家...

3 个回答

1

如果L是一个包含非零数字的列表,那么那些是数字N的因子的列表就是:

factors = [x for x in L if N % x == 0]

当然,如果N在L中没有因子,这个列表就会是空的。

我不太明白你说的“没有因子的数字”是什么意思,除非你是指“质数”(?)- 其实在StackOverflow上有很多关于如何检查一个数字是否是质数的问题和答案,我会使用gmpy.is_prime(来自我的扩展gmpy),不过这当然是我个人的偏好;-)。

如果你的意思是“所有在L中没有因子的数字”,那么这样的数字是无穷无尽的,所以列出所有这些数字有点困难。这里有一个可以生成这些数字的无限生成器:

import itertools

def nofactorsinlist(L):
  for i in itertools.count():
    if any(x for x in L if i % x == 0):
      continue
    yield i

虽然可以进行一些优化,但这个方法真的很简单,我不太想在不完全理解你想要什么的情况下添加复杂的优化!-)

3

对于第一个问题,你可以使用列表推导式来创建一个新列表,这个列表里的每个元素都不是你选择的那个数字,也不是选择的数字的因子(可以参考代码)。然后把这个新列表和你原来的列表进行比较。

$ python
>>> selected_number = 6
>>> [x for x in range(1,11) if selected_number % x]
[4, 5, 7, 8, 9, 10]

对于第二个问题,检查每个元素是否是质数。如果不是,就检查这些数字有没有因子;对于每个元素,你可以用mod运算去对原始列表进行检查,看看结果是不是全零的列表。不过,我相信还有更快的方法。

5

要检查数字 guess 是否还有其他因数,可以使用 any() 这个函数。

hasfactors = any(guess % n == 0 for n in numbers)

如果想检查剩下的数字是否都是质数,可以使用 all() 这个函数。(因为你提到已经防止用户输入质数,所以我猜你有一个 isprime() 的函数来判断质数):

onlyprimes = all(isprime(n) for n in numbers)

撰写回答