#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int i,j,m,n,flag,count=0;
scanf("%d%d",&m,&n);//m和n是区间的两个端点值
for(i=m,flag=0;i<=n;i++)
{
for(j=2,flag=0;j<=sqrt(i);j++)
{
if(i%j==0)
{
flag=1;
count++;
break;
}
}
if(flag==0 && i>=2)
{
printf("%d ",i);
}
}
if(count==0)
{
printf("该区间内没有素数");
}
return 0;
}
以上代码可以实现输出用户输入的区间内的全部素数,其中关键点为:
1.嵌套循环,外层循环用来遍历区间内的数,内层循环用来确认区间内具体某个数是否是素数。
2.素数大于1,且除了1和它本身以外没有别的因数。一般确认某数a是否为素数的方法是使a依次对比它小的数取余,若有余数为0则a可以被整除,a不是素数,若余数均不为0,则a不能被整除,a是素数。
3.sqrt(a)是根号a的意思。如果a对小于等于根号a的数取余均不为0,那么对于剩下的比a小的数,它们也不是a的因数。两个数相乘等于a,除非这两个数相等,不然a的一对因数一定是一个比根号a小,另一个比根号a大,如果比根号a小的数里没有a的因数,就可以确定剩下的数也没有a的因数。
比如,4*4=16,6*5=30,两个比根号a大的数的乘积一定比a大。
用这种方式判断a是否是素数,可以提升程序的运行效率。
4.标志变量,或称旗帜变量,这里用flag表示。flag初始值设为0,如果内层循环判断了一个数是素数,则将flag的值更改为1,内层循环结束后,在外层循环根据flag的值就可以确定一个数是否是素数、是否需要输出。
5.计数器,这里用count表示。
若想知道区间是不是没有素数,应该知道每一次内层循环的运行结果,flag的值一直得是0。然而flag的值变来变去显然不能满足要求,如果最后一次进入内层循环的数使flag的值为0,我们也不能判定flag的值一直是0,因此需要再引入一个变量count,如果flag的值有一次为1,则count++,这样就可以计算有几个数为素数,在外层循环再判断一下count是否为0,若为0说明一直没有素数,即可输出“该区间内没有素数”.
6.负数没有质数一说,但若输入区间内包含负数,根据以上运算规则就会将负数也输出,因此在外层循环根据flag的值输出素数时需要加一个条件,即此数>=2
小白的学习笔记,若有错误欢迎指正!