2013-10-31 57 views
1

我做了一項家庭作業:在5 ** 200,000的數字中找到最大50,000個連續數字的總和。 我知道,如果我在這個數字上做循環,它不會在可行的時間內結束。 我試圖把這個數字放在一個列表中,並遍歷列表,我不明白它是如何工作的?爲什麼它不像第一種情況?是什麼讓它更快? 這是我的代碼:作業:永不結束循環5 ** 200000

def maxdigits(number,digits): 
    s=str(number) #conversting the number to a string 
    l = [int(char) for char in s] 
    maximum = current = sum(l[:digits]) 
    for i in range(0,len(l)-digits): 
     current = current-l[i]+l[i+digits] 
     if current > maximum: maximum = current 
    return maximum  
+4

定義「數字5 ** 200,000中連續50,000個數字的最大總和」。這與數字的總和有什麼不同?你在說連續50,000個數字嗎?無論如何,你的問題在於數學洞察力,而不是代碼。 – Marcin

+0

是的,我將5 ** 200000轉換爲字符串 – CnR

+0

該代碼在我的機器上運行良好。 – colcarroll

回答

2

我覺得你問爲什麼不迅速在數5**200000完整的數字的循環,而循環遍歷所有在0(5**200000)-1範圍內的數字需要很長時間。

我認爲這對你不明顯的唯一原因是因爲這些數字很難記下來。再想一想。將1000000的七位數字或0的百萬位數字循環到999999會更快嗎? 5**200000中有139795位數字。做一個簡單的循環139795次不是一個大量的工作。這是一個龐大的工作來做一個簡單的循環5**200000次。這是一個荒謬的數字。如果宇宙中的每個原子都是一臺計算機,並且每個原子都在宇宙的一生中奔跑,我懷疑它們會成功地做任何事情5**200000次。

1

的代碼運行速度更快,因爲不是遍歷列表

[ 0, 1, ..., 5 ** 200000 ] 

你迭代

[ 0, 1, ..., 139 795 - 50000 ] 

,這比第一個更小的訂單名單。

而且你計算在該號碼位數的方法是:

200000 * log5 + 1