Re: [問題] zj e295. IO 優化

作者: firejox (Tangent)   2019-07-11 23:58:12
光用推文表達可能有點不太清楚,所以來回一篇了
※ 引述《nevikw39 (☆牜攵☆犬羊)》之銘言:
: 大家好,
: 暑假廢惹那麼多天,今天總算來做點有意義的事喇
: 題目網址:https://zerojudge.tw/ShowProblem?problemid=e295
: 我現在的問題是,寫了個自訂的讀整數函式,卻沒有辦法準確知道何時 EOF。
: 在我的 Windows 10 (gcc 6.3), WSL Ubuntu (gcc 7.3) 上遇到 Crtl + Z 或 Crtl + D 都
: 可以正常離開,但在 ZeroJudge 連範例測資測試執行都會 TLE 被 killed。
: 程式碼:https://pastebin.com/YzWYFedy
: 請各位大大不吝給予意見指教,謝謝
: 順便問一下,同樣是函式模板,為什麼 out 就會自動推導型別,in 卻得自己指定呢?
對於小測資會有TLE,通常是卡在有迴圈的地方。而這邊只有兩個地方是有迴圈的,
而且會影響while(!feof(stdin))的是輸入,因此要去檢查輸入函式。
Q1: 在讀到檔尾,或者遇到輸入錯誤時,他會回傳什麼?
inline char get()
{
char buf[1];
fread(buf, 1, 1, stdin);
return *buf;
}
A: 不知道,因為buf未初始化。(13誡第1條)
Q2: 這樣會導致TLE?
A: 會的,因為get()的回傳端看編譯器怎麼處理未初始化變數。
假設每次呼叫時buf的位址都一樣且都不會把區域變數內容清空。
那麼在讀到EOF時,get()會回傳最後一個輸入的字元。如果不是數字,
則會跳出do-while,反之則無窮迴圈。
Q3: ZJ的範測最後一行沒換行?
A: 是,請注意游標位置。
分享點個人心得,要判斷輸入輸出是否有惱人的換行,可以善用反白,
你可以看得到獨特的小方格。
作者: nevikw39 (牧)   2019-07-12 21:36:00
感謝 f 大,終於過測試執行惹。在 do-while 裡判斷是否eof,是的話看 n 的值決定 return n; 或 exit

Links booklink

Contact Us: admin [ a t ] ucptt.com