已知素数是一个只能被1和自身整除的数。
方法1
1不是素数,2是素数。
若要判断一个数n是否为素数,那么可以利用for循环,取[2,n-1]中的数逐个与n试除。
情况a:如果[2,n-1]中有一个数能被n整除,则这个数不是素数;
情况b:如果[2,n-1]中的所有数都不能被n整除,说明这个数只能被1和自身整除,即这个数是素数。
最后打印结果的思路是:
循环结束后如果为情况a,则执行break指令跳出循环后循环变量 i 的值一定是小于n的;
如果为情况b,则结束循环后循环变量 i 的值就会等于n。
#include<stdio.h>
int main(void)
{
//判断一个数是不是素数
//素数仅能被1和自身整除
int i = 0;
int n=0;
scanf("%d", &n);
//1是素数,2不是素数
if (n == 1)
{
printf("不是素数\n");
}
if (n == 2)
{
printf("是素数\n");
}
for (i = 2; i < n; i++)
{
//判断n能否被1到n中间的数整除
if (n % i == 0)
{
break;
}
}
if (i == n)
{
printf("是素数\n");
}
else
{
printf("不是素数\n");
}
return 0;
}
方法2
因为n不可能被大于n/2的数整除,所以 i 的取值范围可以缩小到[2,n/2],做法与方法一相同。
#include<stdio.h>
int main(void)
{
//判断一个数是不是素数
//素数仅能被1和自身整除
int i = 0;
int n = 0;
scanf("%d", &n);
//1是素数,2不是素数
if (n == 1)
{
printf("不是素数\n");
}
if (n == 2)
{
printf("是素数\n");
}
for (i = 2; i <= n/2; i++)
{
//判断n能否被1到n/2中间的数整除
if (n % i == 0)
{
break;
}
}
if (i == n/2+1)
{
printf("是素数\n");
}
else
{
printf("不是素数\n");
}
return 0;
}
方法3
由数学知识可以证明 i 的取值范围还可缩小为[2,√n]。
注:在C语言编程中开平方根的运算需要用sqrt函数(√n 用 limit 代替),需要调用#include<math.h>头文件。
#include<stdio.h>
#include<math.h>
int main(void)
{
int i = 0;
int n = 0;
scanf("%d", &n);
if (n == 1)
{
printf("不是素数\n");
}
if (n == 2)
{
printf("是素数\n");
}
int limit = sqrt(n);
for (i = 2; i <= limit; i++)
{
if (n % i == 0)
break;
}
if (i > limit)
{
printf("是素数\n");
}
else
{
printf("不是素数\n");
}
return 0;
}
总结:素数的判断很好地考察了对循环语句的使用,我们需要理解循环什么时候结束,以及结束后循环变量的值为多少,掌握这个点可以有助于我们更清晰地完成后面的输出要求。
通过观察你可能发现这三种方法结构大致相同,只是循环体中循环变量的取值范围不同,所以在以后如果一个问题要求我们使用循环语句判断并输出,可以先写出循环语块,接着在循环后可以针对循环变量 i 的值运用 if 语句拟写相应输出。