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

C 語言練習:1 到 10 階乘之和計算(遞歸與迭代雙實現)

     編輯:關於C語言

C 語言練習:1 到 10 階乘之和計算(遞歸與迭代雙實現)

計算 S = 1! + 2! + ... + 10!。本文提供遞歸版階乘函數、迭代累加主函數,並分析整型溢出風險、長整型擴展、預計算表優化等工程實踐要點。

遞歸版階乘函數

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

迭代版階乘(更高效、無棧溢出風險)

long long factorial_iter(int n) {
    long long result = 1;
    for (int i = 2; i <= n; i++) result *= i;
    return result;
}

主程序:累加 1!~10!

#include 

long long factorial(int n) {
    long long res = 1;
    for (int i = 2; i <= n; i++) res *= i;
    return res;
}

int main() {
    long long sum = 0;
    for (int i = 1; i <= 10; i++) {
        long long f = factorial(i);
        printf("%d! = %lld\n", i, f);
        sum += f;
    }
    printf("1! + 2! + ... + 10! = %lld\n", sum);
    return 0;
}

運行輸出


1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
1! + 2! + ... + 10! = 4037913

關鍵點與避坑指南

問題風險解決
`int` 存儲階乘13! = 6227020800 > INT_MAX(2147483647) 溢出用 `long long` (64位,至 20! 安全)
遞歸深度過大n>10⁵ 棧溢出生產環境用迭代
重複計算階乘O(n²) 乘法次數迭代累加時同步更新 `fact *= i`,O(n)
輸出格式 `%d` 對應 `long long`未定義行為用 `%lld` (C99) 或 `%I64d` (MSVC)

極致優化:單循環累加(無需單獨函數)

int main() {
    long long fact = 1, sum = 0;
    for (int i = 1; i <= 10; i++) {
        fact *= i;      // i! = (i-1)! * i
        sum += fact;    // 累加
        printf("%d! = %lld\n", i, fact);
    }
    printf("Sum = %lld\n", sum);
    return 0;
}

只用一次乘法、一次加法每輪,無函數調用開銷,編譯器極易優化。

擴展:大數階乘和(超過 20!)**

  • C 無內置大整數,需手寫大數乘法(數組/鏈表存儲數位)或用 GMP 庫。
  • Python 原生支持:`sum(math.factorial(i) for i in range(1, 11))` 秒出任意大數結果。

總結

1 到 10 階乘之和是「階乘函數 + 累加循環」的基礎組合練習。核心教訓:**選對數據類型(`long long`)、優選迭代遞歸、單循環融合計算避免重複**。此模板直接應用於「階乘尾部零 (LeetCode 172)」、「排列組合計數」、「概率期望計算」等組合數學編程問題。

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