为什么下面的代码会判断出9,25这些数是素数?求解。
```c
#include<stdio.h>
#include<math.h>
int main()
{
int su(int n),a;
printf("shuru");
scanf("%d",&a);
if(su(a))
printf("yes");
else
printf("no");
return 0;
}
int su(int n)
{
for(int i=2; i<=sqrt(n); i++)
{
if(n%i==0)
return 0;
else
return 1;
}
}
```
你的代码中的问题在于 su 函数只检查了 n 是否能被 2 整除,而没有进行后续的循环检查,因此对于一些合数(非素数)例如 9、25 等,也会输出 "yes"。
可以通过优化 su 函数,应该在循环中检查 n 能否被 2 到 $sqrt(n)$ 之间的数整除,如果能,说明 n 不是素数,返回 0;如果循环结束仍然没有找到能整除 n 的数,说明 n 是素数,返回 1。
下面是我修改后的代码如下所示:(可以参考)
#include <stdio.h>
#include <math.h>
int su(int n);
int main() {
int a;
printf("请输入一个整数:");
scanf("%d", &a);
if (su(a)) {
printf("yes\n");
} else {
printf("no\n");
}
return 0;
}
int su(int n) {
if (n <= 1) {
return 0;
}
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
修改如下,改动处见注释,供参考:
#include<stdio.h>
#include<math.h>
int main()
{
int su(int n), a;
printf("shuru:");
scanf("%d", &a);
if (su(a))
printf("yes");
else
printf("no");
return 0;
}
int su(int n)
{
if (n < 4) return n > 1; // 修改
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
return 0;
//else // 修改
// return 1; // 修改
}
return 1; // 修改
}
最基本的就是定义一个二维数组,对其进行向右 向下 向左 向上的依次循环。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
判断一个数是否是素数的C语言程序:
#include <stdio.h>
int is_prime(int n) {
if (n <= 1) {
return 0;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
if (is_prime(n)) {
printf("%d是素数\n", n);
} else {
printf("%d不是素数\n", n);
}
return 0;
}
判断一个数n
是否是素数的步骤如下:
n<=1
的情况,因为小于等于1的数都不是素数;n
的所有可能的因子,即从2到$\sqrt{n}$;n
,那么n
就不是素数,直接返回0;n
就是素数,返回1。提示:素数,就是只能被1和它本身整除的正整数。