HDU 1000是經典的ACM入門題「A+B Problem」,考察基本輸入輸出、循環控制與文件結束符處理。本文詳細解析題目要求、核心代碼邏輯與關鍵技術點。
1 1 → 輸出2
#include <stdio.h>
int main() {
int A, B;
while (scanf("%d %d", &A, &B) != EOF) {
printf("%d\n", A + B);
}
return 0;
}
scanf返回成功匹配並賦值的輸入項數EOF(通常為-1,定義在<stdio.h>)while (scanf("%d%d", &A, &B) != EOF):持續讀取直到EOFscanf返回0(匹配失敗),不等於EOF,循環繼續,但緩衝區未消費導致死循環while (scanf("%d%d", &A, &B) == 2),明確要求匹配2個項Ctrl+Z後回車,Linux/Mac按Ctrl+D./a.out < input.txt,讀完文件自動觸發EOFcat data.txt | ./a.outprintf("%d\n", sum):每行一個結果,\n換行符必不可少fflush(stdout)可強制刷新,但通常\n自動觸發行緩衝刷新| 錯誤代碼 | 現象 | 原因 | 修正 |
|---|---|---|---|
| while(scanf(...) != EOF) | 非數字輸入死循環 | scanf返回0不等於EOF,緩衝區不消費 | 改為 == 2 |
| printf("%d", sum) | Presentation Error | 缺少換行符 | 加 \n |
| main()無返回類型 | 編譯警告/錯誤 | C99要求int main() | int main() { return 0; } |
| 忘記&取地址 | 運行時崩潰 | scanf需變量地址 | scanf("%d", &A) |
計算SUM(n) = 1+2+...+n,輸入多行n,每行輸出結果後跟空行:
while (scanf("%d", &n) == 1) {
long long sum = (long long)n * (n + 1) / 2; // O(1)公式法
printf("%lld\n\n", sum); // 兩個\n產生空行
}
注意:結果可能超過int範圍,用long long(%lld)。
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long A, B;
while (cin >> A >> B) { // 運算符>>返回流對象,轉bool判斷狀態
cout << A + B << '\n';
}
return 0;
}
ios::sync_with_stdio(false)、cin.tie(nullptr)關鍵優化,否則C++流較C stdio慢倍數cin >> A >> B自動處理空白分隔、類型轉換、EOF狀態<stdio.h>/<iostream>)main返回int並return 0scanf檢查返回值== 2(或cin >> A >> B)printf格式字符串含\nint足夠(通常32位有符號±21億)HDU 1000雖簡單,但蘊含了競技編程輸入輸出處理的核心模式:循環讀取 → 判斷狀態 → 計算 → 格式化輸出。掌握這一模式及scanf/cin返回值語義、EOF處理、緩衝區刷新,是解決所有OJ輸入題目的基礎。