在线编译器 C

#include <stdio.h> int is_prime(int n, int delitel){ if(n%2==0){ printf("0"); } return (is_prime(n,delitel++)); printf("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` 函数没有正确的终止条件,导致无限递归。每次调用 `is_prime(n, delitel++)` 时,`delitel` 会递增,但函数没有检查 `delitel` 是否已经达到 `n` 或 `sqrt(n)` 来停止递归。同时,`printf` 语句在递归调用之后,永远不会被执行。

其次,函数返回类型是 `int`,但递归路径中没有 `return` 语句返回有效值,只有 `printf` 输出字符,这会导致未定义行为。

- 检查递归的终止条件:质数判断需要在 `delitel` 达到某个上限(比如 `n` 或 `sqrt(n)`)时停止,并返回正确结果。
- 注意 `delitel++` 是后置递增,在递归调用中传递的是递增前的值,这可能导致无限循环。考虑使用 `delitel + 1` 或前置递增。