首先,实际上需要检查任何 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