注册 登录
编程论坛 Python论坛

这哪里错了,本来答案应该是6,28,496,8128

蟒蛇出洞 发布于 2021-08-25 17:03, 1850 次点击
程序代码:

def is_perfect (n):
    '''判断一个自然数是否为完美数'''
    s = 0
    for i in range(1,n):
        if n % i == 0:
            s += i
        return s == n
def main():
    '''寻找完美数'''
    for n in range(1,10000):
        if is_perfect(n):
            print(n)


if __name__ == '__main__':
    '''程序入口'''
    main()
7 回复
#2
蟒蛇出洞2021-08-25 17:34
#3
apull2021-08-26 09:14
is_perfect 里的return前面去掉一个tab。在for里直接return了。
#4
蟒蛇出洞2021-08-26 09:46
回复 2楼 蟒蛇出洞
谢谢大佬
#5
蟒蛇出洞2021-09-01 18:28
#6
蟒蛇出洞2021-09-01 18:28
#7
傻眼猫咪2021-09-01 22:54
另外一種方法:其時間複雜度更好
程序代码:
import math

def isPerfect(num):
    """ Determine whether a natural number is a perfect number """
    if num <= 0: return False
    i = 1
    s = 0
    while i <= math.sqrt(num):
        if num % i == 0:
            s += i
            if i*i != num:
                s += (num/i)
        i += 1
    return (s-num) == num



def main():
    """ Find the perfect number """
    for n in range(1,99999): # 這裡我改成更大數值做測試,完全沒有問題
        if isPerfect(n):
            print(n)


if __name__ == '__main__':
    """ Program entry """
    main()


如果想算出極大數值,可以用梅森質數:
prime = [2, 3, 5, 7, 13, 17, 19, 31] # 梅森質數
isPerfect = lambda p: (1<<(p-1))*((1<<p)-1)
for i in prime:
    print(isPerfect(i))


輸出:
程序代码:
6
28        
496      
8128      
33550336  
8589869056
137438691328
2305843008139952128


[此贴子已经被作者于2021-9-2 11:08编辑过]

#8
j2linux2021-10-07 09:28
http://blog.

完美数和亲和数Python和C 此博文包含图片 (2020-08-17 22:16:06)转载▼
标签: python c python多进程 python终端显色 亲和数和完美数    分类: 计算机与 Internet
1