ACM/ICPC 模式下,程式從標準輸入讀取、向標準輸出寫入,評測系統以文件比對判定正確性。測試資料常包含多組案例,因此掌握各類輸入模式與輸出格式至關重要。本文系統整理六種常見輸入模式、字串讀取技巧與三種輸出格式要求,附 C/C++ 代碼範本。
評測系統(如 PC²)僅支援「一題一輸入檔、一輸出檔」,故須將多組測資集中在單一檔案中,程式需一次讀完並輸出所有結果。
最簡單,直接讀取兩整數並輸出和。
// C
scanf("%d %d", &a, &b);
printf("%d\n", a + b);
// C++
cin >> a >> b;
cout << a + b << endl;
使用 `scanf` 回傳值或 `cin` 布爾轉換判斷結束。
// C
while (scanf("%d %d", &a, &b) != EOF) printf("%d\n", a + b);
// C++
while (cin >> a >> b) cout << a + b << endl;
關鍵:`scanf` 成功讀取變數個數,失敗回傳 EOF(-1)。
先讀 N,再用 `for` 或 `while (n--)` 迴圈處理。
scanf("%d", &n);
for (i = 0; i < n; i++) { scanf("%d%d", &a, &b); printf("%d\n", a+b); }
// 或
while (n--) { scanf("%d%d", &a, &b); printf("%d\n", a+b); }
讀取後檢查標記值。
// C
while (scanf("%d %d", &a, &b) && (a || b)) printf("%d\n", a+b);
// C++
while (cin >> a >> b && (a || b)) cout << a+b << endl;
典型題目 SDUTOJ 1013,外層讀 N,內層累加 M 個數。
while (scanf("%d", &n) && n) {
sum = 0;
while (n--) { scanf("%d", &a); sum += a; }
printf("%d\n", sum);
}
效能提示:大量 I/O 時 C++ iostream 明顯較慢,建議改用 C 標準庫。
for (i = 0; i < n; i++) {
printf("%d\n", sum);
if (i != n-1) printf("\n");
}
格式錯誤常被判為 Presentation Error 甚至 Wrong Answer,務必嚴格對照題目要求。