これは私が今持っているコードです。質問に対して正しい結果を返すことができません。
def problem(n):
myList = [1,n]
for i in range(1,n):
result = int(n ** .5)
new = n/result
i = i + 1
myList.append(new)
return myList
これは私が今持っているコードです。質問に対して正しい結果を返すことができません。
def problem(n):
myList = [1,n]
for i in range(1,n):
result = int(n ** .5)
new = n/result
i = i + 1
myList.append(new)
return myList
の因数は、すべて均等にn
分割される数値です。n
したがって、 ifi
の要因です。n
n % i == 0
1からまでの番号ごとにこのテストを実行する必要がありn
ます。その条件が真の場合は、その番号をリストに追加します。
このコードを書き始めたときに問題が発生した場合は、試したことで質問を更新してください。
上記のアプローチは要因を見つけるための最も効率的な方法ではないことに注意してください。しかし、これは初心者プログラマーにとっての演習にすぎないように思われるので、素朴なアプローチが期待されます。
コードにはいくつかの問題があります。まず第一に、i
あなたのfor
ループはすでにそれを行っているので、インクリメントする必要はありません。次に、いくつかの基本的な数学の原則を使用して、渡された数値の平方根までの範囲の数値を調べるだけで済みます。2 番目の部分は、再生して実験するために残しておきます。
def problem(n):
myList = []
for i in range(1, n+1):
if n % i == 0:
myList.append(i)
return myList
より高度なアプローチとして、非常に強力なリスト内包表記を試すことができますが、通常は小さなデータ セットに適しています。
def problem(n):
return [x for x in range(1, n+1) if n % x == 0]
1 から n ** 0.5 + 1 まで反復するだけでよく、因数はすべて i であり、途中で拾った n/i になります。
例: 係数 10:
1から4まで反復するだけです
i = 1 => 10 % 1 == 0 なので、因数: i = 1, 10 / i = 10
i = 2 => 10 % 2 == 0 なので、因数: i = 2, 10 / i = 5
i = 3 => 10 % 3 != 0、要因なし
これ以上先に進む必要はありません。答えは 1、2、5、10 です。
def problem(n):
myList = []
for i in xrange(1, int(n ** 0.5 + 1)):
if n % i == 0:
if (i != n/i):
myList.append(i)
myList.append(n / i)
else:
myList.append(i)
return myList
結果:
>>> problem(10)
[1, 10, 2, 5]
>>> problem(12)
[1, 12, 2, 6, 3, 4]
>>> problem(77)
[1, 77, 7, 11]
>>> problem(4)
[1, 4, 2]
>>> problem(64)
[1, 64, 2, 32, 4, 16, 8]
>>> len(problem(10 ** 12))
169
リスト内包表記を使用します。
In [4]: num=120
In [5]: [x for x in range(2,int(num/2)+1) if num%x==0]
Out[5]: [2, 3, 4, 5, 6, 8, 10, 12, 15, 20, 24, 30, 40, 60]
In [6]: num=121
In [7]: [x for x in range(2,int(num/2)+1) if num%x==0]
Out[7]: [11]