在线编译器 C

#include <stdio.h> int is_prime(int n, int delitel) { if(n==1||n==0){ return 0; } if (n % delitel == 0 && delitel <= n) { return 0; } if (n % delitel != 0 && delitel <= n) { return (is_prime(n, delitel + 1)); } int main() { int x, all; scanf("%d", &x); all = is_prime(x, 2); if (all == 1) { printf("YES"); } else printf("NO"); return 0; }
这段代码试图用递归方式判断一个整数是否为素数。它定义了一个函数 `is_prime`,接受两个参数:待检测的数 `n` 和当前除数 `delitel`。主函数读入一个整数,调用 `is_prime(x, 2)`,然后根据返回值输出 "YES" 或 "NO"。

代码中存在几个问题:

- 递归函数中缺少一个明确的终止条件,当 `delitel` 超过 `n` 的平方根或达到 `n` 时,应该返回 1(表示是素数),但当前代码没有这个分支。
- 第二个 `if` 语句中的条件 `delitel <= n` 会导致当 `delitel` 等于 `n` 时,如果 `n % delitel == 0` 会错误地返回 0,而实际上任何数都能被自身整除,这不代表它不是素数(除了 1 和 0)。
- 函数中有一个 `if` 分支没有返回值,这会导致未定义行为。

- 检查递归的终止条件:当 `delitel` 大于 `n` 的平方根时,应该返回 1,而不是继续递归。
- 注意处理 `delitel` 等于 `n` 的情况:一个数总能被自身整除,但这不意味着它不是素数,所以判断条件需要调整。