5

私はPythonで完全数のラボを行いました。これは正常に実行され、必要な数を出力します。しかし、(1、1000)を範囲内に配置する必要があるのか​​、(2、n + 1)で問題ないのかわかりませんか?私に頼む私の指示

「Pythonプログラムを作成して、1から10,000までのすべての完全数を見つけます。完全数が見つかったら、ロジックがそれを出力する必要があります。」

完全数とは何ですか:

数論では、完全数は、適切な正の約数の合計、つまり、数自体を除いた正の約数の合計(アリコート合計とも呼ばれます)に等しい正の整数です。同様に、完全数とは、そのすべての正の約数(それ自体を含む)の合計の半分である数、つまりσ1(n)=2nです。

プログラムを実行すると、6、28、496、および8128が出力されます。

 n = 1
 while True:
     factors = [1]
     [factors.append(i) for i in range(2,n+1) if n%i == 0]
     if sum(factors) == 2*n: print n
     n += 1
4

5 に答える 5

4

(1,n) 次のようなもの:完全数はそれ自体を除くすべての約数の合計に等しいため、範囲を使用することもできます。6=1+2+3

n = 1
while True:
    factors =(i for i in range(1,n) if n%i == 0) #use a generator expression
    if sum(factors) == n: 
        print n
    n += 1

出力:

6
28
496
8128

またはワンライナー:

In [2]: [x for x in xrange(1,10001) if sum(y for y in xrange(1,x) if x%y==0)==x]
Out[2]: [6, 28, 496, 8128]
于 2012-09-14T21:02:50.817 に答える
2

n内側のループまで行く必要はありません。range(2, n/2 + 1)、、を使用できますif sum(factors) == n - 1。外側のループは通過している必要がありますrange(2, 10001)(つまり、この範囲内のすべてをテストする必要がありnます)。1は完全数とは見なされないため、範囲に含めるべきではないことに注意してください。

for n in range(2, 10001):
    if sum(i for i in range(2, n/2 + 1) if n % i == 0) == n - 1:
        print n
于 2012-09-14T20:57:44.953 に答える
1

さて、あなたが追加できるかなりの数の簡単な改善があります。

まず、を使用しrange(2,n)ます。n%nが0であることがわかっているので、nをチェックする必要はまったくありません。合計は2*nではなくnでなければならないことを覚えておいてください(因子のリストにnを追加したため、2 * nが表示されます)。

本当にスピードアップしたい場合は、を使用してrange(2, int(math.sqrt(n)))ください。aがnの因数である場合、n/aも同様です。([i, n/i])したがって、iだけでなく追加することもできます。'を忘れないでくださいimport math

于 2012-09-14T20:58:00.703 に答える
0

nを除算する範囲[1..n]のすべての数値を生成する必要があるため、range(2、n + 1)を使用する必要があります。コードの簡略化されたバージョンは次のとおりです。

for n in range(1, 10001):
  factors = [i for i in range(1,n+1) if n % i == 0]
  if sum(factors) == 2*n: print n
于 2012-09-14T20:57:55.913 に答える
0

あなたや何かを侮辱したかったわけではありませんが、コーディングのスタイルが本当に好きではありません.なぜ何かが適切に機能するのかを理解するのに時間がかかる場合. 2*n; factor = [] と range(1,n). で書けるのに、なぜ factor = [1] なのか :)

私は同じように書きます(または、python初心者の意識を惜しまないようにリスト内包表記を削除しました):

n = 1
while True:
    factors = []
    [factors.append(i) for i in range(1,n) if n % i == 0]
    if sum(factors) == n:
        print n
    n += 1

同じ出力。

于 2012-09-14T21:11:25.977 に答える