1

Python での完全数の計算に問題があります。どうやらコードは VBA で動作しているようなので、構文/インデントに間違いがあると確信しています。助けてください!

これが私のコードです:

Mynum=int(input("How many perfect numbers do you want?: "))

counter=0
k=0
j=2
i=1

while counter<Mynum:
    for i in range (1,j-1):
        if (j%i)==0:
            k=k+1
    if k==j:
        counter=counter+1
        print(i)
    k=0
    j=j+1
4

2 に答える 2

1

あなたのスクリーンショットのコードは、どちらが優れているかという点で壊れていk = k + 1ますk = k + i。あなたがprint(i)いつ印刷する必要があるjk

Mynum = int(input("How many perfect numbers do you want?: "))

counter = 0
j = 2

while counter < Mynum:
    k = 0

    for i in range (1, j):

        if (j % i) == 0:
            k += i

    if k == j:
        counter += 1

        print(j)

    j += 1

しかし、全体像を見ると、これは完全数を探すための間違ったアプローチです。この方法を使用すると、最初の 4 つ以上を見つけることはほとんどありません。

How many perfect numbers do you want?: 5
6
28
496
8128

そのため、それらを選択して、ユーザーがいくつ欲しいかを尋ねることを忘れた方がよいでしょう。

より良いアプローチの例は、Lucas-Lehmer primality testを使用して Mersenne 素数を検索し、それが見つかったら、そこからコンパニオン完全数を計算することです。これはあまり多くのコードを必要とせず、現在のアプローチを飛躍させます。

于 2016-10-05T03:03:39.547 に答える
0

完全数の別の解は次のとおりです。

import itertools as it

def perfect():
    for n in it.count(1):
        if sum(i for i in range(1, n+1) if n%i == 0) == 2*n:
            yield n

>>> list(it.islice(perfect(), 3))
[6, 28, 496]
100 loops, best of 3: 12.6 ms per loop

または、因子を使用することもできます (わずかに高速なソリューションの場合)。

def factors(n):
    for a in range(1, int(n**0.5)+1):
        if n % a:
            continue
        x = n // a
        yield a
        if a != x:
            yield x

def perfect():
    for n in it.count(1):
        if sum(factors(n))==2*n:
            yield n

>>> list(it.islice(perfect(), 3))
[6, 28, 496]
1000 loops, best of 3: 1.43 ms per loop

高速な素数バージョンを使用すると、これをさらに改善できます。Pythonで素数の効率的な無限ジェネレーターを実装する方法
から単純な素数ジェネレーターを取得しますか? )

import itertools as it
import functools as ft

def primegen():
    yield 2
    D = {}
    for q in it.count(3, 2):
        p = D.pop(q, None)
        if p is None:
            D[q*q] = q
            yield q
        else:
            x = q + 2*p
            while x in D:
                x += 2*p
            D[x] = p

def ll(p):   # Lucas-Lehmer
    if p == 2:
        return True
    m = 2**p - 1
    return ft.reduce(lambda s, _: (s**2 - 2) % m, range(3, p+1), 4) == 0

def perfect():
    for p in primegen():
        if ll(p):
            yield (2**p-1)*(2**(p-1))

>>> list(it.islice(perfect(), 3))
[6, 28, 496]
100000 loops, best of 3: 7.94 µs per loop
>>> list(it.islice(perfect(), 10))
[6,
 28,
 496,
 8128,
 33550336,
 8589869056,
 137438691328,
 2305843008139952128,
 2658455991569831744654692615953842176,
 191561942608236107294793378084303638130997321548169216]
1000 loops, best of 3: 613 µs per loop

これらは非常に急速に大きくなります。たとえば、20 番目の完全数は 2663 桁です。

于 2016-10-05T03:06:36.170 に答える