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

HDU 1000 A+B Problem 入門解析:EOF控制循環與格式化輸出

     編輯:關於C

HDU 1000是經典的ACM入門題「A+B Problem」,考察基本輸入輸出、循環控制與文件結束符處理。本文詳細解析題目要求、核心代碼邏輯與關鍵技術點。

題目描述

  • 任務:計算A + B
  • 輸入:每行包含兩個整數A和B,處理到文件結束(EOF)
  • 輸出:每組數據輸出一行結果
  • 樣例:輸入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;
}

核心技術點深度解析

1. scanf 返回值與 EOF 判斷

  • scanf返回成功匹配並賦值的輸入項數
  • 讀到文件結束且未讀到任何數據時,返回EOF(通常為-1,定義在<stdio.h>)
  • while (scanf("%d%d", &A, &B) != EOF):持續讀取直到EOF
  • 陷阱:輸入非數字(如"abc")時,scanf返回0(匹配失敗),不等於EOF,循環繼續,但緩衝區未消費導致死循環
  • 健壯寫法:while (scanf("%d%d", &A, &B) == 2),明確要求匹配2個項

2. 處理到文件結束(EOF)

  • 交互式終端:Windows按Ctrl+Z後回車,Linux/Mac按Ctrl+D
  • 文件重定向:./a.out < input.txt,讀完文件自動觸發EOF
  • 管道輸入:cat data.txt | ./a.out

3. 輸出格式控制

  • printf("%d\n", sum):每行一個結果,\n換行符必不可少
  • 缺少\n導致輸出緩衝區不刷新,或多行結果粘連,判題失敗(Presentation Error)
  • 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)

進階變體:HDU 1001 Sum Problem

計算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)。

C++ 版本對比


#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 0
  • [ ] scanf檢查返回值== 2(或cin >> A >> B)
  • [ ] printf格式字符串含\n
  • [ ] 數據範圍確認:int足夠(通常32位有符號±21億)
  • [ ] 無多餘輸出(提示語、調試信息)

HDU 1000雖簡單,但蘊含了競技編程輸入輸出處理的核心模式:循環讀取 → 判斷狀態 → 計算 → 格式化輸出。掌握這一模式及scanf/cin返回值語義、EOF處理、緩衝區刷新,是解決所有OJ輸入題目的基礎。

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