題目:輸入整數 n (1 ≤ n ≤ 1,000,000,000),輸出 1 + 2 + ... + n 的值。
樣例:4 → 10,100 → 5050。
// 錯誤示範:O(n) 時間複雜度
long long sum = 0;
for (long long i = 1; i <= n; i++) sum += i; // n=1e9 约需数秒,超時
當 n = 1,000,000,000,迴圈執行十億次,在典型 1-2 秒時限內無法完成。
等差數列求和公式:S = n * (n + 1) / 2
n*(n+1) 可能溢位 32 位元 int (最大 ~21 億)。n=1e9 → n*(n+1) ≈ 1e18,需 64 位元有號整數 (long long / int64_t)。#include
#include // PRIu64, PRId64 跨平台格式宏
int main() {
long long n;
if (scanf("%lld", &n) != 1) return 1; // 讀取失敗
// 使用長整數運算,避免中間結果溢位
long long result = n * (n + 1) / 2;
printf("%lld\n", result); // Windows MSC: %lld / %I64d;GCC/Clang: %lld
return 0;
}
| 編譯器/平台 | scanf 格式 | printf 格式 | 建議 |
|---|---|---|---|
| GCC / Clang / Linux / macOS | %lld | %lld | 標準 C99 |
| MSVC (Visual Studio) | %lld (VS2013+) | %lld (VS2013+) / %I64d (舊版) | 優先用 %lld,配合 _CRT_STDIO_ISO_WIDE_SPECIFIERS |
| 跨平台專案 | %lld | PRId64 (需 inttypes.h) | 最可攜 |
int (32-bit) 約 ±2.1×10⁹;long long (64-bit) 約 ±9.2×10¹⁸,足容納 n=1e9 的結果 (5×10¹⁷)。scanf 回傳值。n=1 → 1,n=1,000,000,000 → 500000000500000000。此題是「數學優化 + 型別選擇」的經典入門組合,牢記公式與 long long 即可輕鬆通過。