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

C語言計算階乘累加和(1!+2!+…+20!)的高效算法實現

     編輯:C 語言問答

問題描述

計算 S = 1! + 2! + 3! + … + 20!。直接對每個 i 重新計算 i! 會導致大量重複乘法,時間複雜度 O(n²)。利用遞推關系 i! = (i-1)! × i 可降為 O(n)。

優化算法核心思想

  • 維護 fact 變量存儲當前階乘值,初始 fact = 1 (即 0!)。
  • 循環 i = 1..20:fact *= i 更新為 i!,隨即 sum += fact 累加。
  • 最終 sum 即為所求。

完整代碼(含溢出說明)

#include <stdio.h>

int main() {
    long long fact = 1;   // 使用 64 位整數擴大範圍
    long long sum = 0;
    int i;

    for (i = 1; i <= 20; i++) {
        fact *= i;        // fact = i!
        sum += fact;      // 累加
        printf("%2d! = %lld, 累加和 = %lld\n", i, fact, sum);
    }

    printf("\n最終結果: 1!+2!+...+20! = %lld\n", sum);
    return 0;
}

運行結果節選


 1! = 1, 累加和 = 1
 2! = 2, 累加和 = 3
 3! = 6, 累加和 = 9
...
19! = 121645100408832000, 累加和 = 128425485935180314
20! = 2432902008176640000, 累加和 = 2561327494111820314

最終結果: 1!+2!+...+20! = 2561327494111820314

關鍵點提示

  1. 數據類型選擇:20! ≈ 2.43×10¹⁸,超過 32 位有符號整數上限 (2.14×10⁹),必須用 long long (64 位),否則會溢出得到負數或錯誤結果(原帖輸出 268040729 即為 32 位 long 溢出後的值)。
  2. 避免重複計算:利用遞推關系,每輪僅 1 次乘法、1 次加法,極大提升效率。
  3. 格式化輸出:%lld 對應 long long,%2d 對齊列寬,便於觀察。

擴展思考

  • 若 n > 20,64 位也會溢出,需引入大整數庫(如 GMP)或自定義高精度乘法。
  • 同理可解決 1^1 + 2^2 + … + n^n 等遞推型累加問題。

總結

計算階乘累加和的關鍵在於識別遞推關系並選擇足夠寬度的整數類型。本文提供的 O(n) 算法配合 long long,可在標準 C 環境下正確求得 20 以內的精確結果,是解決此類問題的標準範式。

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