1. 什麼是C語言的階乘計算
本篇以 C 語言 階乘為主題,學習階乘計算的基礎知識。階乘(factorial)是指對於自然數 n,將 1 到 n 的所有連續整數相乘的結果。在數學上表達如下:
- n! = n × (n – 1) × (n – 2) × … × 1
這個計算在組合、機率論、數列運算等多種數學應用中都扮演重要角色。例如,3!(3 的階乘)就是 3 × 2 × 1 = 6。本文將詳細解說如何用 C 語言來實作階乘。
2. C語言階乘計算的基礎:活用for迴圈
首先,學習如何利用 for 迴圈來進行階乘計算。這種方法不使用遞迴函式,相對簡單且易於理解。
基本的for迴圈實作
以下是使用 C 語言 for 迴圈計算階乘的範例程式碼。
#include <stdio.h>
int main() {
int n, i;
unsigned long long factorial = 1; // 用來儲存階乘結果的變數
printf("請輸入整數: ");
scanf("%d", &n);
// 若為負數,顯示錯誤訊息
if (n < 0)
printf("負整數沒有階乘。\n");
else {
// 計算階乘
for (i = 1; i <= n; ++i) {
factorial *= i;
}
printf("%d 的階乘 = %llu\n", n, factorial);
}
return 0;
}
說明
- 之所以使用
unsigned long long
型態,是因為階乘計算結果有可能非常大,一般的int
型態不夠用,所以要用能表示更大範圍的unsigned long long
。 - for 迴圈從 1 執行到 n,每次將目前的值乘到
factorial
變數中。
這種方法簡單,是理解階乘計算的基礎。接下來介紹使用遞迴函式的做法。
3. 用遞迴函式計算階乘
階乘計算也可以用遞迴函式來實現。這種方式可以讓程式更短,且更貼近數學上階乘的定義。
遞迴函式實作
以下為 C 語言中用遞迴函式計算階乘的程式範例。
#include <stdio.h>
// 遞迴函式定義
unsigned long long factorial(int n) {
if (n == 0 || n == 1)
return 1; // 基本條件: n 等於 0 或 1 時,階乘為 1
else
return n * factorial(n - 1); // 遞迴計算 n 與 (n-1) 的階乘
}
int main() {
int n;
printf("請輸入整數: ");
scanf("%d", &n);
if (n < 0)
printf("負整數沒有階乘。\n");
else
printf("%d 的階乘 = %llu\n", n, factorial(n));
return 0;
}
說明
- 遞迴函式會先設基本條件(n 為 0 或 1 時),這很重要,否則遞迴會無限進行下去,無法正確結束。
- 遞迴運算跟數學上的階乘定義(n! = n × (n – 1)!)完全相同,直觀且易於理解。
使用遞迴可以讓程式碼更精簡、易讀,但計算大數時效能可能比 for 迴圈略差。

4. 錯誤處理與資料型態的選擇
計算階乘時,數值可能會過大導致溢位,也需要處理負數輸入的錯誤。
防止溢位
由於階乘值成長很快,一般 int
型態裝不下。因此,和上述程式一樣,建議使用 unsigned long long
型態來處理較大的數。
若數值大到連 unsigned long long
都不夠,則可考慮使用大數運算函式庫(如 GNU MP 等)。
負數的錯誤處理
階乘不定義於負整數,因此用戶若輸入負數,要提示錯誤訊息。
if (n < 0)
printf("負整數沒有階乘。\n");
這樣可避免用戶輸入不合法資料時產生錯誤。
5. 階乘計算的應用範例
階乘在數學與演算法中有許多應用。以下介紹幾個常見實例。
組合計算
組合(Combination)是在給定元素中選出特定數量元素的計算方式,公式如下,使用階乘計算:
- C(n, r) = n! / (r! * (n – r)!)
在 C 語言實作時,也可以直接重用階乘函式來計算。
機率計算
在機率論領域,處理排列與組合時經常要用到階乘,是基本的數學運算。
6. 效能最佳化建議
若要提升階乘計算效能,有幾種方式。例如,使用遞迴時,計算層級加深會影響效能,因此可考慮記憶體化(Memoization)或迴圈最佳化技術。
利用記憶體化提升效能
所謂記憶體化,就是將計算過的結果暫存下來,下次再用到時直接取用,減少重複運算,讓遞迴效率大幅提升。
7. 總結與進階學習方向
本文從 C 語言階乘的基礎、遞迴函式的運用、錯誤處理、到效能最佳化皆有介紹。階乘是數學及演算法中不可或缺的概念。歡迎你參考本文內容,實際動手寫階乘相關程式,加強理解。
進一步的學習方向
接下來可挑戰將階乘計算實際應用於專案或 App。例如:
- 挑戰更進階的演算法
面對組合、機率等問題時,運用階乘可讓你解決更多數學與程式設計挑戰。尤其在競賽程式設計或數學題時,階乘應用很常見,可鍛鍊實戰能力。 - 大數據時代的效能最佳化
處理大量資料時,最佳化階乘演算效能非常重要。可以嘗試記憶體化(Memoization)、動態規劃等技術,寫出高效程式。