```c
# include<stdio.h>
# include<math.h>
int prime(int a)
{
int b=2,flag=1;
while (b<=sqrt(a)) //设a=6
{
if(a%b==0)
{
flag=0;
}
b++;
} //构造函数prime()判断素数
if(a==1)
{
flag=0;
} //上述函数无法解决1的存在
return flag; //这里不理解,为什么返回的是flag
}
int main()
{
int m,n;
scanf("%d %d",&m,&n);
for(;m<=n;m++)
{
if(prime(m)) //调用函数prime,参数a=m
{
printf("%d ",m); //为什么这里输出的是m
}
}
return 0;
}
```
prime(m)这个函数用来判断m是不是素数,如果m是素数,就返回flag=1,输出m
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void Judge(int m, int n);
int main()
{
int a,b;
printf("请输入所查找的区间:\n");
scanf("%d %d",&a,&b);
printf("该区间的素数为:\n");
Judge(a,b);
return 0;
}
void Judge(int m, int n)
{
int i,j;
for(i=m;i<=n;i++)
{
for(j=2;j<i-1;j++)
{
if (i%j == 0)
break;
}
if(j>=i-1)
printf("%d ",i);
}
}
遍历n到m之间的数,记为x,这边方便理解就举个例子,x =36
每个数如果是不是素数,那他一定可以分解为除了1和他本身外的另外一组数的乘积,例如218,又例如66
将而对于这样的一组数,他必定有一个因数是小于x开平方根的,即sqrt(x)
因为如果两个数都大于sqrt(x),那乘积就应该大于(sqrt(x))^2,即大于x
这样我们只需要遍历1到sqrt的因数,看看x是否能除尽就可以判断m是否为素数
代码里prime()函数只是判断数字m是否为素数的,是就返回1,不是就返回0
然后如果返回了flag为非0值,就可以确定m是素数,从而进行打印
首先要理解素数的定义,素数是只能被1和本身整除,任何数都能被1整除,所以只要看是否只能被本身整除即可。所以while循环那里就是从2根号a开始一个个判断是否能整除,如果能就说明不是素数。一个不好理解的点是为啥不是从2a,一个个判断,而是到根号a,这是为了减少判断次数,因为如果根号a都不能整除,那么比他更大的数就更不能整除了。
回答第一个问题:为什么返回flag?
答:你们把flag作为一个标记。当判断他不是素数的时候,把flag置为0。当判断是素数的时候,把flag置为1。我们需要把flag的值返回给主函数。
回答第二个问题:为什么输出输出m?
答:你得知道。m就是要判断的数,是不是素数。把m当做参数传给个自定义函数。那个自定义函数返回Flag=1.就满足了if的条件,可以把m打印出来。否则不打印。