0
点赞
收藏
分享

微信扫一扫

C语言 递归实现分解质因数

#include <stdio.h>

void&nbsp;prim(int&nbsp;n,&nbsp;int&nbsp;i){
if(n&nbsp;&gt;=&nbsp;i){
while(n&nbsp;%&nbsp;i){
i++;
}

n&nbsp;/=&nbsp;i;

prim(n,&nbsp;i);

printf(&quot;%d\n&quot;,&nbsp;i);
}
}

int&nbsp;main(){

int&nbsp;num,&nbsp;i&nbsp;=&nbsp;2;

scanf(&quot;%d&quot;,&nbsp;&amp;num);

prim(num,&nbsp;i);

return&nbsp;0;
}

运行结果:
C语言 递归实现分解质因数_质因数

while(n&nbsp;%&nbsp;i)

代表取余。当余数是0的时候表示除尽,结束while循环,即找到一个质因数,此时一个质因数即为 i 。如果没有除尽则会继续执行 i++,i 的最大值为 i 的值等于 n的值,当 i 等于 n 的时候这个循环一定会结束,成为结束这个循环的最终条件。不会让程序陷入死循环。

n&nbsp;/=&nbsp;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。


举报

相关推荐

0 条评论