在线编译器 C

#include <stdio.h> void print_prime_factors(int n, int delitel){ if(n%delitel==0){ printf("%d ",delitel); return print_prime_factors(n/delitel, delitel); } if(n%delitel!=0){ return print_prime_factors(n, delitel+1); } if(n/delitel==1){ printf("%d",delitel); return; } } int main(){ int x; scanf("%d",&x); print_prime_factors(x,2); return 0; }
这段代码试图打印一个整数的质因数分解,但存在逻辑问题。函数 `print_prime_factors` 使用递归,参数 `delitel` 从2开始递增,检查是否能整除当前 `n`。

代码的主要问题是递归的终止条件和顺序不正确。当 `n` 被除到1时,应该停止递归,但当前的条件 `if(n/delitel==1)` 可能永远不会触发,因为递归在 `n` 变为1之前可能已经因为其他条件而无限循环或错误返回。

- 检查递归的终止条件:当 `n` 等于1时,应该结束递归,而不是在 `n/delitel==1` 时。当前代码在 `n` 变为1后,`n%delitel` 永远不会为0,会一直增加 `delitel` 导致无限递归。
- 注意递归调用的顺序:当找到一个质因数后,应该继续用同一个 `delitel` 检查是否能再次整除,但当前代码在 `if(n%delitel==0)` 分支中正确递归后,后续的 `if` 条件仍然会被检查,可能导致逻辑混乱。建议使用 `if-else if` 结构确保每次只执行一个分支。