HDU 1001要求計算SUM(n) = 1 + 2 + ... + n,輸入多行n直到EOF,每行輸出結果後跟空行。本文解析數學優化、輸入處理與格式控制要點。
SUM(n),結果行後跟一個空行1 100 → 輸出1、空行、5050、空行等差數列求和公式:SUM(n) = n × (n + 1) / 2
n × (n + 1)可能暫時溢出int,雖題目保證最終結果在範圍內,中間過程建議用long long:
long long sum = (long long)n * (n + 1) / 2;
#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;
}
scanf("%d", &n)返回成功匹配賦值的項數1:成功讀入一個整數EOF(-1):文件結束,無數據可讀0:匹配失敗(如輸入"abc"),緩衝區未消費 → 若用!=EOF會死循環while (scanf("%d", &n) == 1)printf("%lld\n\n", sum):\n\n輸出結果行 + 空行printf("%lld\n\n", sum)n用int足夠(題目隱含範圍)long long防溢出%lld(C99)或%I64d(Windows舊版MSVC)
#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正確 | 無需特殊處理 |
10^9,long long仍足夠(~5×10¹⁷)SUM(a..b) = (a+b)×(b-a+1)/2HDU 1001通過簡單的等差數列求和,考察:數學優化意識、scanf返回值語義、輸出格式精確控制、類型溢出防範。這四項是所有OJ題目通用的核心基本功。