1. 程式人生 > 其它 >C語言 遞迴實現分解質因數

C語言 遞迴實現分解質因數

技術標籤: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++
執行結果truetrue

注:在C語言中 1為true , 0為false. 當 n % i 的結果為0時,迴圈體才會結束。

while 迴圈體第二次執行:

while(15 % 3)是否執行 i++
執行結果falsefalse

此時結束 while 迴圈。

開始執行 n /= i; 語句,這條語句由以下過程實現

15 / 3 = 5; n = 5;
用 n 的值 ÷ 質因數(迴圈體結束後得到的 i 結果)再把商賦值給 n。

再次呼叫 prim(n, i)函式。


prim函式第二次執行:

判斷 5 >= 3
執行結果true

while 迴圈體第一次執行:

while(5 % 3)是否執行 i++
執行結果truetrue

while 迴圈體第二次執行:

while(5 % 4)是否執行 i++
執行結果truetrue

while 迴圈體第二次執行:

while(5 % 5)是否執行 i++
執行結果falsefalse

此時結束 while 迴圈。

開始執行 n /= i; 語句,這條語句由以下過程實現

5 / 5 = 1; n = 1;
用 n 的值 ÷ 質因數(迴圈體結束後得到的 i 結果)再把商賦值給 n。
再次呼叫 prim(n, i)函式。


prim函式第三次執行:

判斷 1 >= 5
執行結果false

第三次函式結束執行開始逐層結束第一次和第二次執行的函式
其次結束第二次執行的prim函式列印 5
最後結束第一次執行的prim函式列印 3

所以最後得出 3 和 5 是 15 的分解質因數。

注:變數 i 在整個遞迴的過程中初始值為2,在每次prim(n, i)函式呼叫的時候不會被初始化,遞迴過程中共用的都是同一個變數 i 的值。只有當main函式程式結束的時候,變數 i 的值才會在記憶體中銷燬,當程式再次重新執行時,變數 i 的值才會初始化為2。