まず第一に、 int で割り切れるかどうかを実際にチェックする必要があるセットは、 rangez
よりも小さいです。理由は次のとおりです。6 で割り切れる数は、その約数でも割り切れます。N
1-N
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
退屈なものは片付けたので、ここにあなたの仕事をする簡単なワンライナーがあります:
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