#include
/**
* 遞迴判斷質數
* @param n 待測數
* @param d 當前測試除數 (初始呼叫傳 n-1)
* @return 1=質數, 0=合數
*/
int isPrime(int n, int d) {
if (n <= 1) return 0;
if (d == 1) return 1; // 測試完所有除數,無法整除 → 質數
if (n % d == 0) return 0; // 能被整除 → 合數
return isPrime(n, d - 1); // 測試下一個除數
}
/**
* 遞迴質因數分解並輸出
* @param n 待分解數
* @param d 當前候選除數 (初始呼叫傳 n)
*/
void factorize(int n, int d) {
if (n <= 1) return; // 分解完成
// 找到質因數且商為 1 (最後一個因數)
if (n % d == 0 && isPrime(d, d - 1) && n == d) {
printf("%d", d);
return;
}
// 找到質因數 (非最後一個)
if (n % d == 0 && isPrime(d, d - 1)) {
printf("%d*", d);
factorize(n / d, d); // 繼續分解商,從同一除數開始 (處理重複因數)
return;
}
// 當前除數不行,嘗試下一個較小除數
factorize(n, d - 1);
}
int main() {
int n = 54;
printf("%d = ", n);
factorize(n, n);
printf("\n");
return 0;
}
| 步驟 | factorize(n, d) | 條件判斷 | 動作 | 輸出 |
|---|---|---|---|---|
| 1 | factorize(54, 54) | 54%54=0, isPrime(54)=0 | factorize(54, 53) | - |
| ... | ... | ... | ... | ... |
| 2 | factorize(54, 27) | 54%27=0, isPrime(27)=0 | factorize(54, 26) | - |
| 3 | factorize(54, 3) | 54%3=0, isPrime(3)=1, 54!=3 | 印 "3*", factorize(18, 3) | 3* |
| 4 | factorize(18, 3) | 18%3=0, isPrime(3)=1, 18!=3 | 印 "3*", factorize(6, 3) | 3*3* |
| 5 | factorize(6, 3) | 6%3=0, isPrime(3)=1, 6!=3 | 印 "3*", factorize(2, 3) | 3*3*3* |
| 6 | factorize(2, 3) | 2%3!=0 | factorize(2, 2) | - |
| 7 | factorize(2, 2) | 2%2=0, isPrime(2)=1, 2==2 | 印 "2", return | 3*3*3*2 |
54 = 3*3*3*2
雙重遞迴 (質數判斷 + 分解主流程) 可在無迴圈限制下實作質因數分解。關鍵在於**找到因數後保持除數不變遞迴處理商**以支援重複質因數。此解法僅供演算法教學理解遞迴替代迴圈,**生產環境嚴禁使用**。