C語言 遞迴實現分解質因數
阿新 • • 發佈:2020-12-20
技術標籤:C
#include <stdio.h>
void prim(int n, int i){
if(n >= i){
while(n % i){
i++;
}
n /= i;
prim(n, i);
printf("%d\n", i);
}
}
int main(){
int num, i = 2;
scanf("%d", &num);
prim(num, i);
return 0;
}
執行結果:
while(n % i)
代表取餘。當餘數是0的時候表示除盡,結束while迴圈,即找到一個質因數,此時一個質因數即為 i 。如果沒有除盡則會繼續執行 i++,i 的最大值為 i 的值等於 n的值,當 i 等於 n 的時候這個迴圈一定會結束,成為結束這個迴圈的最終條件。不會讓程式陷入死迴圈。
n /= i;
讓 n 除去這個質因數,然後再進入求新 n 質因數的遞迴。
例如:
當求 15 的分解質因數
當 n = 15, i = 2時;
prim函式第一次執行:
判斷 15 >= 2 | |
---|---|
執行結果 | true |
while 迴圈體第一次執行:
while(15 % 2) | 是否執行 i++ | |
---|---|---|
執行結果 | true | true |
注:在C語言中 1為true , 0為false. 當 n % i 的結果為0時,迴圈體才會結束。
while 迴圈體第二次執行:
while(15 % 3) | 是否執行 i++ | |
---|---|---|
執行結果 | false | false |
此時結束 while 迴圈。
開始執行 n /= i; 語句,這條語句由以下過程實現
用 n 的值 ÷ 質因數(迴圈體結束後得到的 i 結果)再把商賦值給 n。
再次呼叫 prim(n, i)函式。
prim函式第二次執行:
判斷 5 >= 3 | |
---|---|
執行結果 | true |
while 迴圈體第一次執行:
while(5 % 3) | 是否執行 i++ | |
---|---|---|
執行結果 | true | true |
while 迴圈體第二次執行:
while(5 % 4) | 是否執行 i++ | |
---|---|---|
執行結果 | true | true |
while 迴圈體第二次執行:
while(5 % 5) | 是否執行 i++ | |
---|---|---|
執行結果 | false | false |
此時結束 while 迴圈。
開始執行 n /= i; 語句,這條語句由以下過程實現
用 n 的值 ÷ 質因數(迴圈體結束後得到的 i 結果)再把商賦值給 n。
再次呼叫 prim(n, i)函式。
prim函式第三次執行:
判斷 1 >= 5 | |
---|---|
執行結果 | false |
第三次函式結束執行開始逐層結束第一次和第二次執行的函式
其次結束第二次執行的prim函式列印 5
最後結束第一次執行的prim函式列印 3
所以最後得出 3 和 5 是 15 的分解質因數。