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

C語言計算階乘(10!)完整程式碼與遞迴/迴圈兩種實現比較

     編輯:程式設計綜合問答

階乘(Factorial)是經典的C語言入門練習。本文提供計算10!的完整程式碼,比較迴圈法與遞迴法的寫法、效能與適用場景,並說明資料型別選擇對溢位的影響。

迴圈法(推薦:簡單、無堆疊溢位風險)

#include <stdio.h>

int main() {
    int n = 10;
    unsigned long long result = 1; // 10! = 3,628,800 符合 32-bit,但建議用64-bit預留空間
    
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    
    printf("%d! = %llu\n", n, result);
    return 0;
}

遞迴法(教學示範:優雅但深度受限)

#include <stdio.h>

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

int main() {
    int n = 10;
    printf("%d! = %llu\n", n, factorial(n));
    return 0;
}

資料型別與溢位對照表

型別最大值最大可算階乘
int (32-bit)2,147,483,64712! = 479,001,600
long long / unsigned long long (64-bit)18,446,744,073,709,551,61520! = 2,432,902,008,176,640,000
double≈1.8e308170! (精度會遺失)

進階:大整數階乘(突破64-bit限制)

若需計算100!等大數,需實作高精度乘法(陣列/向量模擬手算乘法)或使用GMP庫。核心邏輯:

// 陣列每個元素存一位數字,低位在前
int digits[500] = {1}; // 初始值 1
int len = 1;

for (int k = 2; k <= 100; k++) {
    int carry = 0;
    for (int i = 0; i < len; i++) {
        int prod = digits[i] * k + carry;
        digits[i] = prod % 10;
        carry = prod / 10;
    }
    while (carry > 0) {
        digits[len++] = carry % 10;
        carry /= 10;
    }
}
// 輸出時反向列印 digits[len-1] ... digits[0]

總結建議

  • 教學/考試/小數值:迴圈法 + unsigned long long最穩健。
  • 理解遞迴概念:寫遞迴版本並追蹤呼叫堆疊。
  • 實務大數運算:引入成熟大數庫(GMP、Boost.Multiprecision)或自行實作高精度類。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved