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。请记住,总和应该是 n 而不是 2*n(您看到 2*n 是因为您已将 n 添加到因子列表中)。

如果您真的想加快速度,请使用range(2, int(math.sqrt(n))). 如果 a 是 n 的因数,则 n/a 也是。所以你可以追加([i, n/i])而不是仅仅 i。不要忘记import math'。

于 2012-09-14T20:58:00.703 回答
0

您想获取范围 [1 .. n] 中除 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

并不是我想侮辱你什么的,但我真的不喜欢编码风格,当需要时间来理解时,为什么某些东西可以正常工作(我的意思是,为什么要写 n+1 然后 sum(factors) == 2*n; 如果你可以写因子 = [] 并且在范围(1,n)内,为什么因子 = [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 回答