我是一个python noob并且在设置一个循环时遇到问题,该循环检查int z是否可以被一组数字整除,例如我写了下面的代码片段,但它们都返回X = [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个)这些案件中的每一个都出了什么问题吗? 谢谢你的帮助!
答案 0 :(得分:1)
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
答案 1 :(得分:0)
问题不在于Python,而在于你的数学问题。如果x小于n,则x % n == x
。特别是,没有小于21的整数可以是每个数字为零的模数,最多为21. 3 % 18
是3.所以你需要重新考虑你所要求的。如果你真的试图找到一个可以被1到21之间的每个数字整除的数字,那么你得到的唯一数字就是数字很大(例如21!)。
答案 2 :(得分:0)
print [z for z in range(10000) if all(z%k==0 for k in range(1,10))]
>>> [0, 2520, 5040, 7560]
似乎有效。第二个例子,我似乎没有被初始化。第三种似乎有效。
PS:请注意,事实(21)相当大,肯定大于1000000 - 这不是一个完美的结果,但它可能比第一个答案低一两倍(素数分解yadda yadda)答案 3 :(得分:0)
在你的第一个例子中,你正在进行一段时间和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以下的任何结果!
答案 4 :(得分:0)
首先,所有数字都可被1整除,甚至为零。所以你的范围(1,21)应该可以通过范围(2,21)
排除1x % 1 == 0
如果x> 始终为True 0并且是一个整数。
然后澄清: 如果你有:
rangeOne = range(1,1000000)
rangeTwo = range(2,21)
其次,您是否只关注rangeOne中可以被rangeTwo中的所有数字整除的数字?
或者您是否正在寻找rangeOne中可能的素数的子集,这样您就可以得到一个数字列表,这些数字不能被rangeTwo中的任何数字整除(结果整数除以分数)?
或者相反,来自rangeOne的所有数字都可以被rangeTwo中的任何一个或多个数字整除,这意味着排除素数。
还有更多这样的案例。
答案 5 :(得分:0)
首先,实际需要检查任何int z
以获得可分性的集合小于N
范围1-N
。原因如下:
任何可被6整除的数字x
也可以被它的因子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