一碗酸梅湯 作品
第247章 對拍、Day1第三題
沒錯,剛才的猜想是憑直覺和少量筆算搞出來的。
要想驗證自己的猜想,除了數學證明,最實用的方式就是對拍。
所謂對拍程序,通俗的說法,就是數據比較器。
方法很簡單。
將窮舉暴力搜索版本的代碼,編譯成可執行文件a;
將運用了猜想,優化後的代碼編譯成b;
然後編寫一個隨機數據生成器,命名為rand;
接下來,就可以製作對拍程序了。
代碼的主體是個有限次的循環。
循環體內部,核心部分是幾個system()函數。
先調用“./rand“生成隨機數據,存入s.in,再分別調用a、b,讀取s.in,輸出a.out和b.out兩個文本文件。
最後調用“diffa.outb.out“,進行比較。
如果發現兩個文本文件不一致,則說明優化後的程序有問題,於是提示錯誤信息以及出錯原因。
這就是對拍,號稱最強的調試辦法,比gdb之類的調試工具好用多了。
江寒寫完對拍之後,設了一個60000次的循環,花了2分多鐘跑完一遍。
結果沒有輸出任何錯誤信息,這表示自己的猜想是完全成立的。
下一步,就該把優化後的代碼擴展到高精度了。
這一步對很多選手來說,都是個難點,很容易大意之下,寫漏一些條件。
比如位數的最大值處理得不好,或者犯下其他的小失誤,就會導致運算出bug。
倒也不一定完全不能運行,只是碰到特殊數據時,可能會得出不正確的輸出。
運氣好的時候,也能正常得分,運氣差一點,可能就會丟分了。
高精度運算的基本原理,是模擬手工列豎式計算,其中要考慮數位對齊和進位、借位處理。
這種代碼在網上有的是,但運算效率上,那些比較常見的代碼,就有點不敢恭維了。
江寒在刷《noip寶典》的時候,自己研究出來了一種高精度算法,可以說是不傳之秘,比網上能找到的示範代碼,要精簡和巧妙很多。
在這道題裡,江寒要做的就是模擬手算高精度乘除法。
如果不打高精度,那麼最多僅能滿足40%的數據要求。
這道題滿分100,能看懂題目,並寫出暴力搜索算法,就能20分。
能發現規律,寫出快速排序,就能得到40分。
要想驗證自己的猜想,除了數學證明,最實用的方式就是對拍。
所謂對拍程序,通俗的說法,就是數據比較器。
方法很簡單。
將窮舉暴力搜索版本的代碼,編譯成可執行文件a;
將運用了猜想,優化後的代碼編譯成b;
然後編寫一個隨機數據生成器,命名為rand;
接下來,就可以製作對拍程序了。
代碼的主體是個有限次的循環。
循環體內部,核心部分是幾個system()函數。
先調用“./rand“生成隨機數據,存入s.in,再分別調用a、b,讀取s.in,輸出a.out和b.out兩個文本文件。
最後調用“diffa.outb.out“,進行比較。
如果發現兩個文本文件不一致,則說明優化後的程序有問題,於是提示錯誤信息以及出錯原因。
這就是對拍,號稱最強的調試辦法,比gdb之類的調試工具好用多了。
江寒寫完對拍之後,設了一個60000次的循環,花了2分多鐘跑完一遍。
結果沒有輸出任何錯誤信息,這表示自己的猜想是完全成立的。
下一步,就該把優化後的代碼擴展到高精度了。
這一步對很多選手來說,都是個難點,很容易大意之下,寫漏一些條件。
比如位數的最大值處理得不好,或者犯下其他的小失誤,就會導致運算出bug。
倒也不一定完全不能運行,只是碰到特殊數據時,可能會得出不正確的輸出。
運氣好的時候,也能正常得分,運氣差一點,可能就會丟分了。
高精度運算的基本原理,是模擬手工列豎式計算,其中要考慮數位對齊和進位、借位處理。
這種代碼在網上有的是,但運算效率上,那些比較常見的代碼,就有點不敢恭維了。
江寒在刷《noip寶典》的時候,自己研究出來了一種高精度算法,可以說是不傳之秘,比網上能找到的示範代碼,要精簡和巧妙很多。
在這道題裡,江寒要做的就是模擬手算高精度乘除法。
如果不打高精度,那麼最多僅能滿足40%的數據要求。
這道題滿分100,能看懂題目,並寫出暴力搜索算法,就能20分。
能發現規律,寫出快速排序,就能得到40分。