看板 Python 關於我們 聯絡資訊
: for n in range(counts): : input_temp=input() : temp=range(1,input_temp+1) : count=0 : for i in temp[4::5]: : count+=logfive(i) : print count 您使用了range(n)來建立一組list,同時又使用了slice切片處理 必須說,當n極大時(python處理無窮長整數可是出了名的) 你的temp會因為製造range(n)這個怪物而極慢 若使用xrange(n)來避免製造怪物,則您就不能用切片處理了。 (其實xrange也不能製造怪物,因為xrange的引數不能是長整數) 除此之外,當temp極大時,使用for迴圈似乎也會特別慢(據說) 試圖用特別的手法來加速是不錯, 但既然都用python了,建議用值覺得方法來解決當前問題就好。 -- 使用python2.6 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.29.51
sbrhsieh:那個 slice 操作是不必要的。他想要 iterate 5 的倍數, 04/13 23:16
sbrhsieh:可以使用 xrange(指定 step)。 04/13 23:18
※ 編輯: apua 來自: 59.104.29.51 (04/14 00:28)
sbrhsieh:不曉得你建議的直覺做法是指? 04/14 00:48
就是您的作法XD 我覺得那樣清楚又直覺
sbrhsieh:是針對原 po 想要使用 slice 來略過前幾個數? 04/14 00:49
sbrhsieh:如果考慮倒要應付極大的數,他這演算法本身也需要大改進 04/14 00:59
因為他的題目一開始有出現99999999!所以應該是要考慮沒錯 不用range/xrange的話,直接用您前面寫的tail_zeros(),因為是單純的計算, 所以不必擔心長整數的影響,輕鬆多了。
hsnu114444:那如果改用range(0,temp_input+1,5)呢? 04/14 01:28
DigiPrince:舊的方法細部再怎麼改還是 O(N)... 04/14 05:43
DigiPrince:如果你真的需要速度,就該好好想想 s 大的演算法。 04/14 05:44
DigiPrince:s 大的演算法是 O(log(n)) 的,大數 O(N) 根本沒勝算 04/14 05:45
是呀 ※ 編輯: apua 來自: 140.109.17.44 (04/14 10:03)