我在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
答案 0 :(得分:1)
您的截图代码(两者中较好的一部分)在几个方面有所不同:您的k = k + 1
表达式应为k = k + i
,因为您要对这些因素求和,而不是计算它们;你应该打印print(i)
或j
:
k
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
然而,从更大的角度来看,这是寻找完美数字的错误方法 - 使用这种方法你不可能找到比前四个更多的数据:
How many perfect numbers do you want?: 5
6
28
496
8128
所以你可能只是去那些而忘记询问用户想要多少。
更好的方法是使用Lucas-Lehmer primality test搜索Mersenne素数,当找到Mensenne素数时,从中计算companion perfect number。这并不需要太多的代码,并且会使你当前的方法蠢蠢欲动。
答案 1 :(得分: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
使用快速素数版本,您可以进一步改善这一点 从How to implement an efficient infinite generator of prime numbers in 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位数。