#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; 语句,这条语句由以下过程实现
15 / 3 = 5; n = 5;
用 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; 语句,这条语句由以下过程实现
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。