0

我是一个 python 菜鸟,并且在设置一个循环来检查 int z 是否可以被一组数字整除,例如被 1 - 10 整除时遇到问题。我编写了以下代码片段,但它们都返回 X =[所有数字of z]... 即他们未能应用 if 条件,以便在给定范围/集合中检查所有 n 的 mod。

X = []
z = 1
while z in range(1,1000):
    if all(z % n == 0 for n in range(1,21)):
        X.append(z) 
    z += 1

也试过:

X = []
if all(i % n == 0 for n in range(1,21)):
    X.append(i)

X = []
for z in range(1,1000000):
    if all(z % n == 0 for n in range(1,21)):
        X.append(z)  

知道在这些案例中的每一个(或至少 1 个)中出了什么问题吗?谢谢您的帮助!

4

6 回答 6

1

编辑:错了,固定答案。

你在用 numpy 吗?numpy 发生了一些有趣的事情,它是所有的版本。

import numpy as np
all( z % n for n in range(1,5)) # NameError
np.all( z % n for n in range(1,5)) # True
z = 5
all( z % n for n in range(1,5)) # False
np.all( z % n for n in range(1,5)) # True
np.all([z % n for n in range(1,5)) # False
于 2012-07-17T20:51:06.290 回答
0

问题不在于 Python,而在于你的数学。 x % n == x如果 x 小于 n。特别是,任何小于 21 的整数都不能为零,直到 21 的每个数字 3 % 18都是 3。所以你需要重新考虑你在问什么。如果你真的试图找到一个能被从 1 到 21 的每个数字整除的数字,那么你将得到的唯一数字将是巨大的数字(例如,21!)。

于 2012-07-17T20:50:37.030 回答
0
print [z for z in range(10000) if all(z%k==0 for k in range(1,10))]
>>> [0, 2520, 5040, 7560]

似乎工作。第二个例子,我似乎没有被初始化。第三似乎有效。

PS:请注意 fact(21) 相当大,肯定大于 1000000 - 这不是一个完美的结果,但它可能比第一个答案低一两个因素(素数分解 yadda yadda)

于 2012-07-17T20:58:35.533 回答
0

在您的第一个示例中,您正在执行一些奇怪的 while 和 for 循环组合,我对它的运行感到有点惊讶!

在第二个示例中,您没有初始化或更新i.

第三个例子有效。但是,第一个能被 1 到 20 之间的所有数字整除的数字是 232792560,这超出了您的范围。

作为替代方案,您也可以在一行中完成

X = [z for z in range(1, 1000000) if all(z % n == 0 for n in range(1, 21))]

但同样,您不会得到低于 232792560 的任何结果!

于 2012-07-17T21:04:34.453 回答
0

首先,所有数字都可以被 1 整除,甚至可以被 0 整除。因此,您的 range(1,21) 可能应该通过 range(2,21) 排除 1

x % 1 == 0 

如果 x > 0 并且是整数,则始终为真。

然后澄清:如果你有:

rangeOne = range(1,1000000)
rangeTwo = range(2,21)

其次,您是否仅在 rangeOne 中寻找可被 rangeTwo 中的所有数字整除的数字?

或者您是否正在寻找 rangeOne 中可能素数的子集,以便您想要获得一个不能被 rangeTwo 中的任何数字整除的数字列表(结果是整数与分数)?

或者与之相反,rangeOne 中的所有数字都可以被 rangeTwo 中的任何一个或多个数字整除,这意味着排除素数。

这样的案例还有很多。

于 2012-07-17T21:21:03.603 回答
0

首先,实际上需要检查任何 int 可除性的集合z小于N范围1-N。原因如下:任何x能被 6 整除的数,也能被它的因数整除,即1,2,3,6.

所以本质上,你的算法是:

for number in rangeArray:
     removeSubList(getAllFactors(number),rangeArray)

翻译成python代码:

#Note: this can be sped up even faster by appending both the multiples 
#at the same time instead of iterating over the range 1,number
#Note: get_all_factors(6) will return [1,2,3] but not [1,2,3,6]
def get_all_smaller_factors(number):
   factors = [number,1] 
   for x in range(1,number):
       if (number % x == 0 and number not in factors):
           factors.append(x)
   return factors


#Note: again, I'm too tired to find proper names, please improve later.
def min_factor_list(max):
    factors = range(1,max)
    for factor in factors:
        #remove the sublist you get from get_all_factors
        factors = [x for x in factor if x not in get_all_smaller_factors(x)] 
    return factors

#Note: again, I'm too tired to find proper names, please improve later.
def accept(input_var, range):
    factors = min_factor_list(range)
    for factor in factor:
         if(input_var % factor is not 0):
            return false

    return true

现在您已经摆脱了无聊的东西,这里有一个简单的 oneliner 可以完成您的工作:

 print "Is %d divisible by range(1,%d)? %r"%(z,max,accept(z,max))

免责声明:我实际上并没有尝试过代码,但这应该可以工作。

编辑:另一种(不是完全不相关但肯定更好)的方法是使用范围(1..range_max)并找到最小公倍数(即LCM)。从那里,您可以简单地检查是否LCM是一个因素Z

min_factor_list方法应该对此有所帮助。您可以简单地将该列表中的每个元素相乘并获得LCM(列表中的任何元素都没有另一个元素作为其因子,或者简单地说,所有元素都是相对质数)

为什么这行得通?因为Z必须至少LCM. 现在下一次你得到一个可以被所有数字整除的数字是什么时候?这与LCM*2. 那之后的下一次呢?LCM*3

于 2012-07-18T00:05:54.583 回答