#28241: C語言避免超時的方法


40321133L (40321133L)

學校 : 國立臺灣師範大學
編號 : 170938
來源 : [180.177.125.56]
最後登入時間 :
2022-05-27 00:27:44
c119. 10220 - I Love Big Numbers -- UVa10220 | From: [140.112.238.167] | 發表日期 : 2021-11-20 14:35

經過測試,測資共有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就行。這樣應該會比我前面提供的第一種方法快很多。

 
ZeroJudge Forum