输入n和m(m≤n)输出两者之间的所有素数

题目是作业输入n和m(m≤n)输出两者之间的所有素数 ,我不理解代码的意思

```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打印出来。否则不打印。