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

#include <stdio.h> int is_prime(int n, int delitel) { if (n % delitel == 0 && delitel <= n) { return 0; } if (n % delitel != 0 && delitel <= n) { return 1; }if(n==1||n==0){ return 0; } 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; }
这段代码试图用递归判断一个数是否为素数。整体思路是:从除数2开始,检查n是否能被整除,如果不能就递归增加除数。但逻辑上有几个问题。

- 递归的终止条件不清晰。当`delitel`超过`n`时,递归应该结束并返回1(表示素数),但你的代码中当`delitel <= n`时才会进入判断,否则会继续递归,导致无限递归或错误结果。
- 前两个条件分支中,当`n % delitel == 0`时返回0(表示不是素数),这正确;但当`n % delitel != 0`时立即返回1,这不对——因为即使当前除数不能整除,还需要检查更大的除数,不能直接判定为素数。
- 对n=0或1的处理放在中间,但可能被前面的条件提前返回,导致逻辑顺序问题。