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

HDU 1001 Sum Problem 解析:等差數列求和與EOF循環輸入

     編輯:關於C

HDU 1001要求計算SUM(n) = 1 + 2 + ... + n,輸入多行n直到EOF,每行輸出結果後跟空行。本文解析數學優化、輸入處理與格式控制要點。

題目描述

  • 輸入:一系列整數n,每行一個,處理到EOF
  • 輸出:每個n輸出SUM(n),結果行後跟一個空行
  • 保證:結果在32位有符號整數範圍內(≤2,147,483,647)
  • 樣例:輸入1 100 → 輸出1、空行、5050、空行

數學優化:O(1) 公式法

等差數列求和公式:SUM(n) = n × (n + 1) / 2

  • 避免O(n)循環累加,n大時效率差異巨大
  • 注意n × (n + 1)可能暫時溢出int,雖題目保證最終結果在範圍內,中間過程建議用long long:

long long sum = (long long)n * (n + 1) / 2;

標準 C 解法


#include <stdio.h>

int main() {
    int n;
    while (scanf("%d", &n) == 1) {  // 讀到EOF或非數字返回!=1
        long long sum = (long long)n * (n + 1) / 2;
        printf("%lld\n\n", sum);    // 兩個\n產生空行
    }
    return 0;
}

關鍵技術點

1. scanf 返回值判斷

  • scanf("%d", &n)返回成功匹配賦值的項數
  • 返回1:成功讀入一個整數
  • 返回EOF(-1):文件結束,無數據可讀
  • 返回0:匹配失敗(如輸入"abc"),緩衝區未消費 → 若用!=EOF會死循環
  • 最佳實踐:while (scanf("%d", &n) == 1)

2. 輸出格式:結果後跟空行

  • printf("%lld\n\n", sum):\n\n輸出結果行 + 空行
  • 或分兩次:printf("%lld\n\n", sum)
  • 判題極嚴格檢查空行,多一行或少一行均為Presentation Error

3. 數據類型選擇

  • 輸入n用int足夠(題目隱含範圍)
  • 計算中間值用long long防溢出
  • 輸出用%lld(C99)或%I64d(Windows舊版MSVC)

C++ 版本


#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    long long n;
    while (cin >> n) {
        long long sum = n * (n + 1) / 2;
        cout << sum << "\n\n";
    }
    return 0;
}

常見錯誤對照表

錯誤代碼現象修正
while(scanf("%d",&n)!=EOF)非數字輸入死循環改為 == 1
printf("%d\n", sum)缺少空行加雙\n或兩次printf
int sum = n*(n+1)/2中間溢出錯誤結果用long long計算
printf("%lld\n", sum)無空行%lld\n\n
未處理n=0或負數題目通常n>0,但公式n=0結果0正確無需特殊處理

擴展思考

  • 若n範圍擴大到10^9,long long仍足夠(~5×10¹⁷)
  • 若n極大(10¹⁰⁰),需大整數庫或字符串模擬乘法除法
  • 通用公式:SUM(a..b) = (a+b)×(b-a+1)/2

HDU 1001通過簡單的等差數列求和,考察:數學優化意識、scanf返回值語義、輸出格式精確控制、類型溢出防範。這四項是所有OJ題目通用的核心基本功。

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