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

C語言計算階乘與階乘求和:迭代、遞迴與單迴圈優化完整解析

     編輯:關於C語言

C語言計算階乘與階乘求和:迭代、遞迴與單迴圈優化完整解析

階乘(Factorial)與階乘求和是遞迴、迭代、累積模式的入門經典題目。本文系統整理:單一數階乘計算、1!+2!+...+n! 求和、單迴圈優化技巧、大數階乘處理、遞迴與迭代效能對比,並提供溢位檢測與任意精度擴展方向。

1. 計算單一數 n!

迭代版(推薦)

long long factorialIterative(int n) {
    if (n < 0) return -1;  // 錯誤碼
    long long result = 1;
    for (int i = 2; i <= n; i++) {
        result *= i;
    }
    return result;
}

遞迴版(教學用)

long long factorialRecursive(int n) {
    if (n < 0) return -1;
    if (n <= 1) return 1;
    return n * factorialRecursive(n - 1);
}

2. 計算 1! + 2! + ... + n!

雙重迴圈直觀版

long long sumFactorialNaive(int n) {
    long long sum = 0;
    for (int i = 1; i <= n; i++) {
        long long fact = 1;
        for (int j = 1; j <= i; j++) {
            fact *= j;
        }
        sum += fact;
    }
    return sum;
}

單迴圈優化版(核心技巧:重用上一項結果)

long long sumFactorialOptimized(int n) {
    long long sum = 0;
    long long currentFact = 1;  // 1! = 1
    for (int i = 1; i <= n; i++) {
        currentFact *= i;       // i! = (i-1)! * i
        sum += currentFact;
    }
    return sum;
}

優化原理圖解

i=1: currentFact = 1*1 = 1! = 1      sum = 1
i=2: currentFact = 1*2 = 2! = 2      sum = 1+2 = 3
i=3: currentFact = 2*3 = 3! = 6      sum = 3+6 = 9
i=4: currentFact = 6*4 = 4! = 24     sum = 9+24 = 33
...
時間複雜度:O(n) vs O(n²)  空間複雜度:O(1)

3. 溢位邊界與類型選擇

類型最大可表示階乘近似值位元數
int (32-bit)12!4.79×10⁸31 bits
long long (64-bit)20!2.43×10¹⁸63 bits
double170!7.26×10³⁰⁶53 bits 精度
long double (80-bit)1754!~10⁴⁹³²64 bits 精度

溢位安全檢測

// 陣列模擬大整數乘法(十進制每位一個元素)
#define MAX_DIGITS 10000

void multiplyBigInt(int *digits, int *len, int multiplier) {
    int carry = 0;
    for (int i = 0; i < *len; i++) {
        int prod = digits[i] * multiplier + carry;
        digits[i] = prod % 10;
        carry = prod / 10;
    }
    while (carry > 0) {
        digits[(*len)++] = carry % 10;
        carry /= 10;
    }
}

void printBigInt(int *digits, int len) {
    for (int i = len - 1; i >= 0; i--) putchar('0' + digits[i]);
    putchar('\n');
}

void bigFactorial(int n) {
    int digits[MAX_DIGITS] = {1};
    int len = 1;
    for (int i = 2; i <= n; i++) {
        multiplyBigInt(digits, &len, i);
    }
    printBigInt(digits, len);
}

// 使用範例:計算 100!
// bigFactorial(100);  // 輸出 158 位數字

5. 進階數學性質與應用

  • 斯特林公式近似:n! ≈ √(2πn) (n/e)ⁿ,用於估算大數階乘數量級。
  • 傳遞閉包計數:排列組合、圖論路徑計數核心公式。
  • 泰勒級數展開:eˣ = Σ xⁿ/n!、sin x = Σ (-1)ⁿ x²ⁿ⁺¹/(2n+1)! 等數值計算基礎。
  • 伽瑪函數延拓:Γ(n) = (n-1)!,將階乘擴展至複數域。

教學建議與面試重點

  1. 必會手寫:迭代版、遞迴版、單迴圈求和優化版。
  2. 必知邊界:0! = 1、負數無定義、溢位類型上限。
  3. 必會優化:單迴圈重用中間結果,O(n²) → O(n)。
  4. 加分項:大數乘法陣列實作、溢位檢測、斯特林公式應用。

階乘計算是理解遞迴、迭代、動態規劃(自底向上)、大數運算、數值分析的絕佳切入點。建議從單迴圈優化版著手,體會「狀態保留與重用」的動態規劃核心思想,再嘗試實作任意精度版本,打通從基礎語法到演算法工程的完整鏈路。

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