首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

ACM 競賽輸入輸出完全指南:六大讀取模式與輸出格式技巧

     編輯:關於C語言

ACM/ICPC 模式下,程式從標準輸入讀取、向標準輸出寫入,評測系統以文件比對判定正確性。測試資料常包含多組案例,因此掌握各類輸入模式與輸出格式至關重要。本文系統整理六種常見輸入模式、字串讀取技巧與三種輸出格式要求,附 C/C++ 代碼範本。

評測機制簡述

評測系統(如 PC²)僅支援「一題一輸入檔、一輸出檔」,故須將多組測資集中在單一檔案中,程式需一次讀完並輸出所有結果。

六大輸入模式

1. 單組測資

最簡單,直接讀取兩整數並輸出和。

// C
scanf("%d %d", &a, &b);
printf("%d\n", a + b);
// C++
cin >> a >> b;
cout << a + b << endl;

2. 多組測資,讀至 EOF

使用 `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)。

3. 首行給定筆數 N,隨後 N 組資料

先讀 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); }

4. 特殊標記結束(如 0 0)

讀取後檢查標記值。

// 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;

5. 巢狀結構:外層 N,內層 M 筆

典型題目 SDUTOJ 1013,外層讀 N,內層累加 M 個數。

while (scanf("%d", &n) && n) {
    sum = 0;
    while (n--) { scanf("%d", &a); sum += a; }
    printf("%d\n", sum);
}

6. 字串讀取

  • 整行:C 用 `gets(buf)`,C++ 用 `getline(cin, buf)` 或 `cin.getline(buf, size)`
  • 以空白分隔:`scanf("%s %s", str1, str2)`
  • 以換行分隔:`gets(str1); gets(str2);`
  • 短字串用 `scanf`,長字串用 `gets`/`getline`
  • 單字元:`c = getchar()`

效能提示:大量 I/O 時 C++ iostream 明顯較慢,建議改用 C 標準庫。

三種輸出格式

  1. 連續輸出,無空行:每行結尾 `\n` 即可。
  2. 每組後一空行:`printf("%d\n\n", ...)` 雙換行。
  3. 組與組之間一空行:非最後一組才多印一個 `\n`。
    for (i = 0; i < n; i++) {
        printf("%d\n", sum);
        if (i != n-1) printf("\n");
    }
    

格式錯誤常被判為 Presentation Error 甚至 Wrong Answer,務必嚴格對照題目要求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved