1 + 2*3 + 4*5*6 + ... 迴圈邏輯、變數初始化、for 分號陷阱求前 n 項和:第 1 項 1,第 2 項 2×3,第 3 項 4×5×6,第 4 項 7×8×9×10 …
for (i = 1; i <= n; i++); // 分號導致迴圈體為空!
for (j = 1; j <= i; j++); // 同理
{
m = m * t; t++;
}
s = s + m;
for (...); 結尾有分號 → **迴圈體為空語句**,大括號內代碼**只執行一次** (迴圈結束後)。m 未在外層迴圈重置,導致累乘錯誤。double/int,scanf("%d", &n) 但 n 宣告為 double。第 k 項從 start_k 開始,連乘 k 個數。
start_1 = 1, start_2 = 2, start_3 = 4, start_4 = 7 …
規律:start_k = 1 + k*(k-1)/2 (等差數列前 k-1 項和 + 1)。
#include
int main(void) {
int n;
printf("輸入項數 n: ");
if (scanf("%d", &n) != 1 || n <= 0) return 1;
long long sum = 0; // 使用長整數防溢位
long long term_start = 1; // 第 1 項起始數
for (int k = 1; k <= n; k++) {
long long term = 1;
for (int j = 0; j < k; j++) {
term *= (term_start + j);
}
sum += term;
term_start += k; // 下一項起始數 = 當前起始數 + 項數 k
}
printf("前 %d 項和 = %lld\n", n, sum);
return 0;
}
輸入項數 n: 4 前 4 項和 = 5167 // 1 + 2*3 + 4*5*6 + 7*8*9*10 = 1 + 6 + 120 + 5040 = 5167
| 問題 | 修正 |
|---|---|
for(...); 多餘分號 | 移除分號,大括號包裹迴圈體 |
m 未重置 | 每項開始 term = 1 |
| 起始數計算錯誤 | term_start += k 遞推 |
| 型別不一致 | 統一用 long long,scanf("%d", &n) |
| 無溢位保護 | 實務加 if (term > LLONG_MAX / (term_start+j)) break; |
for 後絕不加分號** —— 除非故意寫空迴圈 (極少見)。for (int i=...)),作用域最小化。long long**,極大數用任意精度庫 (GMP) 或字串模擬。