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); } int main() { int x; scanf("%d", &x); if(is_prime(x, 2)){ printf("YES"); }else{ printf("NO"); } return 0; }
这段代码试图用递归方法判断一个整数是否为素数。它定义了一个函数 `is_prime`,接受两个参数:待检测的数 `n` 和当前尝试的除数 `delitel`。主函数读入一个整数,调用 `is_prime(x, 2)`,根据返回值打印 "YES" 或 "NO"。

- 递归的终止条件逻辑有误。当 `delitel * delitel < n` 时,函数返回 1,但这意味着只要当前除数的平方小于 n 就认为 n 是素数,这是不对的。实际上,应该是在所有可能的除数都检查完后,如果都没有整除,才返回 1。正确的终止条件是当 `delitel * delitel > n` 时,说明已经检查了所有可能的因子,此时应返回 1。

- 递归调用 `is_prime(n, delitel + 1)` 没有返回值。函数末尾的递归调用结果没有被返回给调用者,这会导致函数行为未定义。递归调用的结果应该用 `return` 语句返回。