Онлайн компилятор C

#include <stdio.h> void print_prime_factors(int n, int delitel) { if (n < 2) { printf("%d ", n); return; } if (n >= 2) { if (n % delitel == 0) { printf("%d ", delitel); n = n / delitel; delitel=2; } else if (n % delitel != 0) { print_prime_factors(n, delitel + 1); } } } int main() { int x; scanf("%d", &x); print_prime_factors(x, 2); return 0; }
这段代码试图用递归方式打印一个整数的质因数分解,但存在逻辑问题。

- 当 `n < 2` 时,直接打印 `n` 本身,这不符合质因数分解的常规做法(例如输入1会打印1,但质因数分解通常不考虑1)。
- 递归调用中,当找到一个因数后,将 `delitel` 重置为2,但此时 `n` 已经更新,继续递归时可能重复检查已经排除的因数,导致效率低下或遗漏。
- 当 `n % delitel != 0` 时,递归增加除数,但缺少对 `n` 本身是质数时的处理(例如输入7,会一直递归到 `delitel` 等于7才打印,但此时没有输出7本身)。

- 提示1:思考质因数分解的终止条件。当 `n` 等于1时应该结束递归,而不是打印1。当 `n` 本身是质数且大于1时,应该直接打印 `n`。
- 提示2:检查当找到一个因数后,为什么要把 `delitel` 重置为2?实际上,同一个因数可能重复出现(例如8=2*2*2),重置为2会导致重复检查已经排除的因数,但更关键的是,重置后递归调用时 `n` 已经变小,应该继续用当前因数尝试,而不是回到2。