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

C 語言練習:階乘交替級數求和 1! - 2! + 3! - 4! + ... + 9!

     編輯:關於C語言

問題描述

計算交替階乘級數:f = 1! - 2! + 3! - 4! + ... + 9!。此題綜合考察嵌套循環計算階乘、符號交替控制、整數溢出風險。

標準實現:雙層循環 + 符號變量

#include <stdio.h>

#define N 9

void f(int m);

int main() {
    f(N);
    return 0;
}

void f(int m) {
    int i, j;
    int k = 1;      // 符號控制
    int s = 1;      // 階乘暫存
    int sum = 0;    // 總和

    for (i = 1; i <= m; i++) {
        // 內層循環計算 i!
        s = 1;                      // 關鍵:每輪重置為 1
        for (j = 1; j <= i; j++) {
            s *= j;
        }
        sum += s * k;               // 累加帶符號項
        k = -k;                     // 符號翻轉
    }
    printf("1!-2!+3!-4!+...+9!=%d\n", sum);  // 輸出: 326981
}

關鍵邏輯深度解析

1. 階乘計算的兩種模式對比

模式代碼時間複雜度適用場景
遞推累積(推薦)fact *= i; 在單層循環中O(n)連續計算 1!~n!,無重複運算
雙層循環重算內層 for(j=1;j<=i;j++) s*=j;O(n²)教學演示嵌套循環,或非連續項

優化版單層循環:

void f_optimized(int m) {
    int i;
    int k = 1;
    int fact = 1;
    int sum = 0;
    for (i = 1; i <= m; i++) {
        fact *= i;        // 遞推:i! = (i-1)! * i
        sum += fact * k;
        k = -k;
    }
    printf("結果: %d\n", sum);
}

2. 變量重置位置的關鍵性

原代碼中 s = 1 放在外層循環開始處(或內層結束後),確保每次計算新階乘時從 1 開始乘。若誤放在外層循環外,s 會持續增大導致邏輯錯誤。

3. 整數溢出風險與對策

  • 32 位 int 範圍:-2,147,483,648 ~ 2,147,483,647。
  • 階乘增長極快:13! = 6,227,020,800 > INT_MAX,13! 即溢出。
  • 本題安全:9! = 362,880,總和 326,981 遠未溢出。
  • 擴展建議:n > 12 時必須用 long long (64 位,可到 20!) 或大整數庫。

數學驗證

手算前幾項:

  • 1! = 1
  • 1! - 2! = 1 - 2 = -1
  • 1! - 2! + 3! = -1 + 6 = 5
  • + 4! = 5 + 24 = 29
  • - 5! = 29 - 120 = -91
  • + 6! = -91 + 720 = 629
  • - 7! = 629 - 5040 = -4411
  • + 8! = -4411 + 40320 = 35909
  • - 9! = 35909 - 362880 = -326971 ⚠️

注意:原代碼輸出 326981(正數),說明級數實為 1! - 2! + 3! - ... + 9! 共 9 項,最後一項為 +9!(奇數項正),結果應為 326981。手算最後一步符號錯誤,正確遞推:

i=1: sum=1
i=2: sum=1-2=-1
i=3: sum=-1+6=5
i=4: sum=5-24=-19
i=5: sum=-19+120=101
i=6: sum=101-720=-619
i=7: sum=-619+5040=4421
i=8: sum=4421-40320=-35899
i=9: sum=-35899+362880=326981  ✓

總結

階乘交替級數是「嵌套循環、狀態維護、溢出意識」的優秀綜合練習。掌握遞推優化(O(n²)→O(n))體現算法優化思維;溢出分析養成工程嚴謹性。建議嘗試實現遞歸版階乘、長整型版本、及通用級數求和函數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved