2

これは私が今持っているコードです。質問に対して正しい結果を返すことができません。

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 
4

4 に答える 4

2

の因数は、すべて均等にn分割される数値です。nしたがって、 ifiの要因です。nn % i == 0

1からまでの番号ごとにこのテストを実行する必要がありnます。その条件が真の場合は、その番号をリストに追加します。

このコードを書き始めたときに問題が発生した場合は、試したことで質問を更新してください。

上記のアプローチは要因を見つけるための最も効率的な方法ではないことに注意してください。しかし、これは初心者プログラマーにとっての演習にすぎないように思われるので、素朴なアプローチが期待されます。

于 2012-11-13T20:54:43.857 に答える
2

コードにはいくつかの問題があります。まず第一に、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]
于 2012-11-13T20:57:16.283 に答える
2

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
于 2012-11-13T21:05:26.100 に答える
0

リスト内包表記を使用します。

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]
于 2012-11-13T20:51:51.357 に答える