首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言級數求和程式修正:1 + 2*3 + 4*5*6 + ... 迴圈邏輯、變數初始化、for 分號陷阱

     編輯:C 語言問答

題目

求前 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) 或字串模擬。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved