一.程序简介
要求
使用循环和分支结构判断一个数是否为素数。输入的数据为正整数(取值范围为1~32767)
结果演示
案例1
输入:233
输出:是素数
案例2
输入:6
输出:不是素数
二.项目分析
1在开始分析代码前,我们要先搞明白素数的概念以及素数的判断方法
素数的概念.质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。
判断方式1.根据定义所有素数都是大于1的自然数,那么小于等于1的数都没有素数的概念。数字2只有1和2两个因数,因而必定是素数,其他数字n只要判定从2到n-1都无法被它整除,就证明该数字是素数。
判断方式2.在判断方式1的基础上仔细思考就会发现,其实数字n的因数分成两大部分,一部分是小于x的平方根,另外一部分大于x的平方根,小于平方根和大于平方根的部分是一一对应的,所以n 不必被 2 ~ n-1 之间的每一个整数去除,只需被 2 ~ √m之间的每一个整数去除就可以了。
还有许多判断素数的方法,如果有其它方法可以分享给博主,在此我就直接演示这两种判断方式了
2.思路分析
- 先准备好工具箱<stdio.h>和<math.h>(方式2中使用,可以用 sqrt(n) 或者 pow(n,1/2)
来实现对n的开方操作) - 然后定义变量,从键盘输入一个整数值
- 最后对数据进行处理,使用循环结构进行判断,如果整除结果等于0,则立即跳出循环,判断其不是素数,若循环条件均不为0,则可判断其为素数
- 大家可以动手实操一下了
三.代码展示
#include<stdio.h>
int main()
{
int n = 0, m = 0;
scanf("%d", &n);
if (n <= 1)//先判断输入的数据是否为大于1的正整数
{
printf("不是素数\n");
return -1;//素数是大于1的正整数,return -1表示程序运行失败
}
for (m = 2; m <= n - 1; m++)
{
if (n%m == 0)
{
printf("不是素数\n");
break;
}
}
//循环结束之后,里面的if一次都不满足,则有m == n,就代表该数确实是一个素数
if (m == n)
{
printf("%d是一个素数\n", n);
}
return 0;
}
但是上述方式运行次数太多,运行效率较低,不是最优解,使用方式二可以大大的增加代码的运行效率,使你的代码更加优雅。
#include<stdio.h>
#include<math.h>
int main()
{
int n = 0, m = 0;
int q = 0;
scanf("%d", &n);
q = (int)sqrt(n); //n的算术平方根,sqrt的返回值是一个双精度浮点型数字,要强制转化为int类型
if (n <= 1)
{
printf("不是素数\n");
return -1;
}
for (m = 2; m <= q; m++)
{
if (n%m == 0)
{
printf("不是素数\n");
break;
}
}
//因为最后一次执行程序时候m比q大1跳出循环,故而需要m==q+1,并非m==q
if (m == q+1)
{
printf("%d是一个素数\n", n);
}
return 0;
}
以上就可以实现对素数的判断了。
四.尾声
初学C语言,有什么错误地方请大家及时提出,博主好进行改正,避免对其他人的误导,也期待你们能有更好的方式去解决该问题,谢谢大家的阅读。