埃筛法求区间素数,,

   素数是仅能被它本身和1整除的任何整数。埃拉托斯特尼筛法,简称埃氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。算法思想:给出要筛数值的范围,找出其以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数3去筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......,如图所示。

编写一个程序,输出区间[m, n]之间的所有素数。
输入格式:
输入的第一行是一个整数t,表示t次查询。 后面的t行中,每行2个整数m和n。
输入保证 2 <= m <= n <= 1000000。

img


输出格式:
对每一行m和n,把区间[m, n]之间的所有素数输出到一行。每个数之后跟一个空格。若区间内无素数,输出-1。

输入样例:
在这里给出一组输入。例如:

2 20
10 40    
20 100

输出样例:
在这里给出相应的输出。例如:

2 3 5 7 11 13 17 19 
11 13 17 19 23 29 31 37 
23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

这是我写的程序,但是输出不了结果

#include<stdio.h>
int main(){
    int t,m,n;
    scanf("%d,&t");
    for(int i=1;i<=t;i++){
        scanf("%d%d",&m,&n);
        for(int k=m;k<=n;k++){
            if((k%2!=0)&&(k%3!=0)&&(k%5!=0)&&(k%7!=0)){
                printf("%d ",k);
        }
            printf("\n");
    }
   }
}

我看不出来有什么问题

#include <stdio.h>
#include <math.h>
int main()
{
    int n,a,mul,min,max,i,j,test=1;
    scanf("%d",&n);
    for(a=1;a<=n;a++)
    {
        scanf("%d %d",&min,&max);
        
            for(i=min;i<=max;i++)
            {
                test=1;
                for(j=2;j<=sqrt(i);j++)
                {
                    if(i%j==0)
                    {
                        test=0;
                        break;
                    }
                }
                if(test==1)
                {
                    printf("%d ",i);
                }
            }
        
        printf("\n");
    }
    return 0;
}


long long k,i,s[MAX],isprime[MAX];
 void prime()
  {
     k=1;
     memset(isprime,1,sizeof(isprime));///初始化都认为是素数
     isprime[0]=0;
    isprime[1]=0;///0和1不是素数
     for(i=2;i<=MAX;i++)
     {
        if(isprime[i])
        {
             s[k++]=i;///保存素数
        }
        for(j=i*2;j<=MAX;j+=i)
        {
            isprime[j]=0;///素数的倍数都不是素数
      }
    }
 }

Mark

我这个解答觉得是到现在为止最完整可行的。

#include <stdio.h>
#include <limits.h>        /* for CHAR_BIT */

#define MAX 1000001

#define BITMASK(b) (1 << ((b) % CHAR_BIT))
#define BITSLOT(b) ((b) / CHAR_BIT)
#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b))
#define BITTEST(a, b) ((a)[BITSLOT(b)] & BITMASK(b))
#define BITNSLOTS(nb) ((nb + CHAR_BIT - 1) / CHAR_BIT)

#define tMax  100
int main(void){
    unsigned int i,j,t,n,m,nArr[tMax],mArr[tMax],mMax=0,flag=0;
    char bitArr[ BITNSLOTS( MAX )]={0};
    scanf("%d",&t);
    for(i=0;i<t;i++){ /*获取每行范围*/
        scanf("%d %d",&nArr[i],&mArr[i]);
        if(mArr[i]>mMax) mMax=mArr[i];
    }
    for(i=2;i*i<=mMax;i++){ /*处理素数表*/ 
        if(!BITTEST(bitArr,i)){ /*原来是0表示是素数*/ 
            for (j =i +i;j<=mMax;j =j+i ){
                BITSET(bitArr,j); 
            } 
        }
    }
    /*结果输出*/
    for(i=0;i<t;i++){
        flag=1;
        for(j=nArr[i];j<=mArr[i];j++){
            if(!BITTEST(bitArr,j)){
                printf("%d ",j);
                flag=0;
            }
        }
        if(flag) printf("-1");
        printf("\n");
    }
    
    return 0;
}