Online Compiler C

#include <stdio.h> int is_prime(int n, int delitel) { if (n < 2) { return 0; } if (delitel * delitel < n) { return 1; } if (n % delitel == 0) { return 0; } is_prime(n, delitel + 1); return; } int main() { int x; scanf("%d", &x); if(is_prime(x, 2)){ printf("YES"); }else{ printf("NO"); } return 0; }
这段代码试图用递归方式判断一个整数是否为素数。主函数读取一个整数,调用 `is_prime(x, 2)` 并根据返回值打印 YES 或 NO。

`is_prime` 函数有三个判断分支:
- 如果 n 小于 2,返回 0(不是素数)。
- 如果 `delitel * delitel < n`,返回 1(是素数)—— 这个条件逻辑有误。
- 如果 n 能被 delitel 整除,返回 0(不是素数)。
- 最后递归调用 `is_prime(n, delitel + 1)`,但递归结果没有被返回。

- 检查第二个条件:`delitel * delitel < n` 表示“除数平方小于 n”时返回 1,这实际上在除数还很小的时候就提前判定为素数,是错误的。应该是在除数平方大于 n 时才停止递归并返回 1。
- 递归调用 `is_prime(n, delitel + 1)` 之后缺少 `return` 语句,导致函数在没有显式返回值的情况下结束,行为未定义。需要将递归调用的结果返回给上一层。