我的完美数字密码

时间:2018-07-29 04:40:45

标签: python

到目前为止,我已经了解了for循环,if语句和计数,因此仅使用这些主题来获得反馈将是很棒的。我正在尝试解决“完美数”问题,其中除数之外的除数等于该数。因此,对于6,除数1,2,3总计为6。我曾尝试查看其他文章,但我想知道为什么我的代码特别无法正常工作。我已经尝试解决了这个问题,但我觉得我快到了。我只有一个问题。这是我到目前为止的内容:

num = 30

for i in range(1,num+1):
    count = 0
    for k in range(1,num+1):
        if i%k == 0 and i!=k:
            count += k
            if count == i:
                print(k,'Perfect',i)

shell的输出给了我这个

3 Perfect 6
8 Perfect 24
14 Perfect 28

我知道24不是一个完美的数字。除24之外的24的最高除数应该是12,但是我得到8。这就是为什么它向我显示24是完美的。谁能说清楚为什么我无法获得12分?

3 个答案:

答案 0 :(得分:2)

您必须计算所有除数,在得出结论之前,您的代码将24乘以8,然后求和所有到目前为止的除数,并声明24为一个完美的数字,不要等待其他除数出现。

您的代码应如下所示:

for i in range(1,num+1):
    count = 0
    for k in range(1,i):  # no point searching for numbers greater than i
        if i%k == 0 :
            count += k
    if count == i:
        print('Perfect',i)

并产生:

('Perfect', 6)
('Perfect', 28)

答案 1 :(得分:1)

您的问题是您要检查count == i是否在错误的位置。您需要检查整个count的总和,而不是每次添加count的总和之后。

num = 30

for i in range(1,num+1):
    count = 0
    for k in range(1,num+1):
        if i%k == 0 and i != k:
            count += k
    if count == i:
         print(k,'Perfect',i)

此外,如果您想要稍微更高效的代码,则可以事后进行减法运算,而不用检查每个值。另外,正如lenik所建议的那样,您只需要数i(因为i的除数不能大于其自身。)更有效的是,人们可以只使用Sieve of Eratosthenes-类似的方法,然后计数到sqrt(i)+1,并在此过程中找到相应的因素:

from math import sqrt    

num = 30

for i in range(1,num+1):
    count = 0
    for k in range(1,sqrt(i) + 1):
        if i%k == 0:
            count += k
            factor = count/k
            # The conditional is necessary in case i is a perfect square.
            if k != factor:
                count += factor
    if count - i == i:
         print(k,'Perfect',i)

答案 2 :(得分:0)

12不是太太1 + 2 + 3+ 4 + 6!= 12 第二个也有计数问题(将其更改为Forbidden (CSRF token missing or incorrect.): /testv/ ) 关键问题是@csrf_exempt

中存在las check
i+1

结果:

3完美6

14完美28