下一個應該是33550336.
你的代碼(我固定壓痕,使其在原則上你想要做什麼):
i = 2
a = open("perfect.txt", 'w')
a.close()
while True:
sum = 0
for x in range(1, i+1):
if i%x == 0:
sum += x
if sum/2 == i:
a = open("perfect.txt", 'a')
a.write(str(i) + "\n")
a.close()
i += 1
確實i
部門找到i
的因數。
因此,要找到最完美的人數達到n
,它在for
循環
2 + 3 + 4 + ... + (n-1) + n = n*(n+1)/2 - 1
部門。
現在,n = 33550336
,這將是
Prelude> 33550336 * (33550336 + 1) `quot` 2 - 1
562812539631615
大約560個* 10個部門。
假設你的CPU可以做每秒10個師(最有可能做不到,10 是在我的經驗更好的估計,但即使是機器int
S IN C),這將大約需要560,000秒。一天有86400秒,因此大概需要六天半(估計超過兩個月)。
你的算法在合理的時間內太慢而無法達到。
如果你不想使用數論(甚至完美的數字有一個非常簡單的結構,並且如果有任何奇數的完美數字,那些必然是巨大的),你仍然可以做得更好,平方根找到除數,
i = 2
a = open("perfect.txt", 'w')
a.close()
while True:
sum = 1
root = int(i**0.5)
for x in range(2, root+1):
if i%x == 0:
sum += x + i/x
if i == root*root:
sum -= x # if i is a square, we have counted the square root twice
if sum == i:
a = open("perfect.txt", 'a')
a.write(str(i) + "\n")
a.close()
i += 1
只需要大約1.3 * 10 部門,應該找到一兩個小時的第五完美一些。
沒有求助於明確的公式,甚至完美的數字(2^(p-1) * (2^p - 1)
素數p
這樣2^p - 1
爲素數),可以通過尋找i
質因數分解和計算從除數總和有所加快步伐。這將使所有複合數字的測試速度更快,並且對於大多數測試來說要快得多,並且對於大多數情況下測試速度要快得多,因此我的機器上估計需要40分鐘左右的時間。
不是一個糟糕的估計:
$ time python fastperf.py
6
28
496
8128
33550336
real 36m4.595s
user 36m2.001s
sys 0m0.453s
你的問題實際上並沒有任何與你的問題。但是,沒有人可以在沒有看到一些代碼的情況下幫助你 – 2013-04-26 22:50:55
你是什麼意思?我打開了存儲所有完美數字的文件,我想知道應用程序找不到其他內容的原因。我不得不解釋什麼是完美數字,並不是每個人都知道什麼是完美數字。 我發佈了一些代碼來幫助你。 – user2154354 2013-04-26 22:57:31