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 == xxがn未満の場合。特に、21未満の整数は、21までのすべての数値でゼロmodになることはできません 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]

うまくいくようです。2番目の例、私は初期化されていないようです。3番目はうまくいくようです。

PS:fact(21)はかなり大きく、確かに1000000よりも大きいことに注意してください。これは完全な結果ではありませんが、最初の答えより1〜2倍低い可能性があります(素因数分解yadda yadda)

于 2012-07-17T20:58:35.533 に答える
0

あなたの最初の例では、while と for ループの奇妙な組み合わせを行っていますが、それがまったく実行されることにちょっと驚きました!

2 番目の例では、初期化も更新もしていませんi

3 番目の例は機能します。ただし、1 から 20 までのすべての数値で割り切れる最初の数値は 232792560 であり、範囲外です。

別の方法として、1行で行うこともできます

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

まず第一に、 int で割り切れるかどうかを実際にチェックする必要があるセットは、 rangezよりも小さいです。理由は次のとおりです。6 で割り切れる数は、その約数でも割り切れます。N1-Nx1,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なければならないためです。では次にすべての数で割り切れる数が得られたときは何になるでしょうか? と同時刻です。で、その次は?LCMLCM*2LCM*3

于 2012-07-18T00:05:54.583 に答える
0

まず、すべての数はゼロでも 1 で割り切れます。したがって、 range(1,21) はおそらく range(2,21) で 1 を除外する必要があります

x % 1 == 0 

x > 0 で整数の場合は常に True です。

それから明確にするために:あなたが持っている場合:

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

次に、rangeTwo のすべての数値で割り切れる rangeOne の数値のみを探していますか?

または、rangeTwo の任意の数で割り切れない数のリストを取得するように、rangeOne から可能な素数のサブセットを探していますか (結果の整数対分数)。

またはその逆で、rangeTwo の任意の 1 つ以上の数値で割り切れる rangeOne のすべての数値 (素数を除外することを意味します)。

そんなケースが増えています。

于 2012-07-17T21:21:03.603 に答える