階乘(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,647 | 12! = 479,001,600 |
long long / unsigned long long (64-bit) | 18,446,744,073,709,551,615 | 20! = 2,432,902,008,176,640,000 |
double | ≈1.8e308 | 170! (精度會遺失) |
若需計算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]