經過測試,測資共有400行,如果每一行平均不能在2~3 ms之內完成,就會超時。
避免超時的方法有兩種,第一是加快運算速度。我是用C語言,做法是利用array來處理大數。把一個數乘到array的時候,不需要每一個element都乘,只要需要乘到當前的最高位數就行。另外,進位時,也不需要loop完整個array。同理,加總時也不需要loop完整個array。
如何知道當前的最高位在哪裡?我的作法是多宣告一個變數,用這個變數來記錄最高位的位置。值得注意的是,這個變數只有在當前最高位進位的時候,才會增加。以下貼上進位步驟時,一些比較關鍵的code供大家參考:
for(j=0; j<num_digits-1; j++){
if(fact[j] > 9){
//進位
}
}
for(; j<num_digits; j++){
if(fact[j] > 9){
//進位num_digits++;
}
}
我用這個做法,最後完成時間是0.7s。
第二種作法,是先把1~1000的答案算好,記錄在一個array裡面,然後再依據測資來輸出答案。這個方法我沒有實際操作過,我是在forum裡面看到的。測資只有400筆,如果測資會超時,算完1000筆當然也會超時。但是算完1000筆的好處是,每次算完n!後,就可以先把位數總和算出來,然後再往下求 (n+1)! 時,只需要把 n! 再乘上 n+1。這樣算一個,就總和一個,照理說,最外面只需要跑一次for loop,從1跑到1000就行。這樣應該會比我前面提供的第一種方法快很多。