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

C 語言函數封裝實戰:計算 1! + 2! + ... + n! 階乘和

     編輯:關於C語言

C 語言函數封裝實戰:計算 1! + 2! + ... + n! 階乘和

本題通過函數分層實現:底層 J(n) 計算單個階乘,上層 main 累加求和,並加入輸入合法性驗證(0 < n ≤ 25),展示 C 語言模塊化編程基本範式。

代碼實現

#include 

#define MAX_N 25

// 階乘函數
int J(int n) {
    int t = 1;
    for (int i = 1; i <= n; i++) t *= i;
    return t;
}

int main() {
    int n, sum = 0, flag = 1;
    // 輸入驗證循環
    while (flag) {
        printf("輸入要計算階乘和的最大數 (0 < n <= %d): ", MAX_N);
        scanf("%d", &n);
        if (n > 0 && n <= MAX_N) flag = 0;
        else printf("輸入無效,請重試!\n");
    }
    // 累加求和
    for (int i = 1; i <= n; i++) sum += J(i);
    printf("1! + 2! + ... + %d! = %d\n", n, sum);
    return 0;
}

關鍵技術點

  1. 函數單一職責:J 只負責階乘,main 負責交互與累加,符合高內聚低耦合。
  2. 輸入防呆:使用 flag 開關變量控制循環,直到合法輸入,避免非法數據導致邏輯錯誤。
  3. 常量定義:#define MAX_N 25 統一上限,便於維護修改。
  4. 數據類型選擇:25! ≈ 1.55×10^25 超出 32 位整數範圍,實際運行會溢出。工程中應改用 long long 或大數庫,此處為教學簡化。

優化版:避免重複計算階乘

int main() {
    // ... 輸入驗證同上 ...
    long long fact = 1, sum = 0;
    for (int i = 1; i <= n; i++) {
        fact *= i;      // 遞推計算 i!
        sum += fact;    // 直接累加
    }
    printf("和 = %lld\n", sum);
    return 0;
}

遞推版將時間複雜度從 O(n²) 降為 O(n),且天然適合大數擴展。

教學總結

  • 函數封裝是構建大型程序的基石。
  • 輸入驗證是健壯程序的必要環節。
  • 算法優化往往源於發現重複計算(此處為階乘遞推關係)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved