數列:1, 2, 4, 7, 11, 16, 22, ...
求前 n 項和 (0 < n < 1000),多組測資直到 EOF。
觀察相鄰項差值:
a₁ = 1 a₂ - a₁ = 1 a₃ - a₂ = 2 a₄ - a₃ = 3 a₅ - a₄ = 4 ... aₙ - aₙ₋₁ = n-1
∴ 通項公式:
aₙ = 1 + Σ(i=1 to n-1) i = 1 + (n-1)n/2 = (n² - n + 2)/2
Sₙ = Σ(k=1 to n) aₖ = Σ (k² - k + 2)/2
= ½ [ Σk² - Σk + Σ2 ]
= ½ [ n(n+1)(2n+1)/6 - n(n+1)/2 + 2n ]
= n(n² + 5)/6
#include <stdio.h>
int main() {
long long n;
while (scanf("%lld", &n) == 1) {
if (n <= 0 || n >= 1000) continue;
long long sum = n * (n * n + 5) / 6;
printf("%lld\n", sum);
}
return 0;
}
// 陣列預生成法,時間 O(n),適合 n 較小或需列印每項
int a[1001];
a[0] = 1;
for (int i = 1; i < 1000; i++) a[i] = a[i-1] + i;
// 前 n 項和
int sum = 0;
for (int i = 0; i < n; i++) sum += a[i];
| 方法 | 時間複雜度 | 空間複雜度 | 適用場景 |
|---|---|---|---|
| 公式法 | O(1) | O(1) | 大量查詢、大 n、嵌入式系統 |
| 陣列預計算 | O(n) 初始化, O(1) 查詢 | O(n) | 需列印每項、多次查詢固定範圍 |
| 遞迴/迴圈累加 | O(n) 每查詢 | O(1) | 單次查詢、n 很小 |
核心思維:遇到數列求和,**先找差分規律 → 推導通項 → 求和公式化簡**。能將 O(n) 降為 O(1) 是演算法優化的經典樂趣。