計算數列 1 - 2 + 3 - 4 + 5 ... + 99 - 100 的總和。這是一個經典的迴圈與條件判斷練習,展示不同思路的程式碼風格與效能差異。
使用 tag 變數在 +1/-1 間切換,單一迴圈完成:
int sum = 0, tag = 1;
for (int i = 1; i <= 100; i++) {
sum += i * tag;
tag = -tag; // 正負號翻轉
}
printf("%d\n", sum); // 輸出 -50
優點: O(1) 空間、O(n) 時間、邏輯清晰、無分支預測失敗。
將奇數、偶數分別存入陣列再累加:
int odd[50], even[50];
int m = 0, n = 0;
// 填入奇數 1,3,5...99
for (int i = 1; i < 100; i += 2) odd[m++] = i;
// 填入負偶數 -2,-4...-100
for (int i = 2; i <= 100; i += 2) even[n++] = -i;
int sum = 0;
for (int k = 0; k < 50; k++) sum += odd[k] + even[k];
printf("sum=%d", sum);
缺點: 額外 O(n) 空間、程式碼冗長、易出界錯誤(原碼有 i1++ 兩次導致邏輯錯誤)。
觀察規律:(1-2) + (3-4) + ... + (99-100) = (-1) × 50 = -50
int sum = -50; // 直接給出結果 // 或通用公式:n 為偶數時 sum = -n/2 int n = 100; int sum = (n % 2 == 0) ? -n/2 : (n+1)/2;
| 方法 | 時間複雜度 | 空間複雜度 | 可讀性 | 推薦度 |
|---|---|---|---|---|
| 正負號翻轉 | O(n) | O(1) | ⭐⭐⭐⭐⭐ | ✅ 首選 |
| 奇偶陣列 | O(n) | O(n) | ⭐⭐ | ❌ 不推薦 |
| 數學公式 | O(1) | O(1) | ⭐⭐⭐⭐ | ✅ 面試加分 |
解決交替加減求和,正負號翻轉法 是工程上最佳平衡;數學公式法 則展現演算法思維深度。避免為簡單問題引入不必要的陣列與複雜索引操作,保持程式碼簡潔、高效、可維護。