我是 Python 的初学者,试图变得更好,我偶然发现了以下练习:
令 n 为大于 1 的整数,s(n) 为 n 的除数之和。例如,
s(12) 1 + 2 + 3 + 4 + 6 + 12 = 28
还,
s(s(12)) = s(28) = 1 + 2 + 4 + 7 + 14 + 28 = 56
和
s(s(s(12))) = s(56) = 1 + 2 + 4 + 7 + 8 + 14 + 28 + 56 = 120
我们使用符号:
s^1(n) = s(n) s^2(n) = s(s(n)) s^3(n) = s(s(s(n))) s^ m (n) = s(s(. . .s(n) . . .)), m times
对于存在正整数 k 的整数 n,使得
s^m(n) = k * n
被称为 (m, k)-完美,例如 12 是 (3, 10)-完美,因为 s^3(12) = s(s(s(12))) = 120 = 10 * 12
特殊类别:
对于 m =1,我们有多重完美数
对于 m = 1 和 k = 2 存在上述一种特殊情况,它们被称为完美数。
对于 m = 2 和 k = 2,我们有超完美数。
编写一个程序,找出并打印所有小于或等于 (<=) MAXNUM 的 m <= MAXM 的完全数。如果整数属于上述特殊类别之一,则程序应打印相关消息。此外,程序必须打印找到了多少个不同的 (m, k) 完美数字,它们占测试数字的百分比,不同对 (m, k) 的出现次数,以及每对的次数发现了特殊类别(完美数字也被视为多重完美)。
这是我的代码:
import time
start_time = time.time()
def s(n):
tsum = 0
i = 1
con = n
while i < con:
if n % i == 0:
temp = n / i
tsum += i
if temp != i:
tsum += temp
con = temp
i += 1
return tsum
#MAXM
#MAXNUM
i = 2
perc = 0
perc1 = 0
perf = 0
multperf = 0
supperf = 0
while i <= MAXNUM:
pert = perc1
num = i
for m in xrange(1, MAXM + 1):
tsum = s(num)
if tsum % i == 0:
perc1 += 1
k = tsum / i
mes = "%d is a (%d-%d)-perfect number" % (i, m, k)
if m == 1:
multperf += 1
if k == 2:
perf += 1
print mes + ", that is a perfect number"
else:
print mes + ", that is a multiperfect number"
elif m == 2 and k == 2:
supperf += 1
print mes + ", that is a superperfect number"
else:
print mes
num = tsum
i += 1
if pert != perc1: perc += 1
print "Found %d distinct (m-k)-perfect numbers (%.5f per cent of %d ) in %d occurrences" % (
perc, float(perc) / MAXNUM * 100, MAXNUM, perc1)
print "Found %d perfect numbers" % perf
print "Found %d multiperfect numbers (including perfect numbers)" % multperf
print "Found %d superperfect numbers" % supperf
print time.time() - start_time, "seconds"
它工作正常,但我想要关于如何让它运行得更快的建议。例如使用起来是否更快
I = 1
while I <= MAXM:
…..
I += 1
代替
for I in xrange(1, MAXM + 1)
如果不是将 s(n) 定义为函数,而是将代码放入主程序中会更好吗?等等。如果您有什么建议让我了解如何使程序运行得更快,我将不胜感激。还有一件事,最初这个练习要求程序是用 C 语言编写的(我不知道),用 Python 编写了这个,把它变成 C 语言会有多困难?