[山东科技大学OJ]1179 Problem J: 筛选素数

 

Time Limit: 1 Sec Memory Limit: 16 MB

Submit: 10974 Solved: 4484

[Submit][Status]

Description

在数学上,素数的分布没有任何已知规律,因此检测一个数是否素数,只能用比它小的素数来检测整除性质。如果要求出一定范围内的素数表直接检测的代价就太高了。一般采用筛选法的思想:

把从1开始的、某一范围内的正整数从小到大顺序排列,1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。

如有:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是:

3 5 7 9 11 13 15 17 19 21 23 25 27 29

剩下的数中3最小,是素数,去掉3的倍数……如此下去直到所有的数都被筛完,求出的素数为:

2 3 5 7 11 13 17 19 23 29

用筛选的办法求出素数表之后,再进行查询。

 

求区间m~n之间的素数,其中m,n为整数,且0<=m<=n<=500000。

 

Input

输入多行,到EOF结束。每行为一个测试用例,两个整数m和n,满足0<=m<=n<=500000。总测试用例数不超过1000个。

 

Output

输出为m~n之间的所有素数,每个数一行,两个测试用例之间用一个空行分隔。

如果m~n之间没有素数,则输出一个空行。

Sample Input

1 2

2 3

8 10

1 11

50 100

900 1000

499900 500000

Sample Output

2

 

2

3

 

 

 

2

3

5

7

11

 

53

59

61

67

71

73

79

83

89

97

 

907

911

919

929

937

941

947

953

967

971

977

983

991

997

 

499903

499927

499943

499957

499969

499973

499979

HINT

Append Code

[Submit][Status]


#include <stdio.h>

#include <stdlib.h>

#include <math.h>

int judge(int s)

{

    int i;

    if(s==1||s==0)

        return 0;

    if(s==2)

        return 1;

    for(i=2;i<=sqrt(s);i++)

     {

          if(s%i==0)

          return 0;

     }

    return 1;

}

int main()

{

    int first=0,end=0,i=0,m=0,k=0;

    int a[500001];

       while(scanf("%d %d",&first,&end)!=EOF)

    {

        m=0;

       for(i=first;i<=end;i++)

       {

           a[i]=i;

       }

       for(i=first;i<=end;i++)

       {

           if(a[i]==-1)

            continue;

           if(judge(a[i])==1)

              {

                  int kl=1;

                  while(1)

              {

                  kl++;

                  int kll=kl*i;

                  if(kll>end)

                    break;

                  a[kll]=-1;

              }

              }

 else

            {

                a[i]=-1;

            }

        }

        int jkl=0;

        for(k=first;k<=end;++k)

        {

            if(a[k]!=-1)

            {

                printf("%d\n",a[k]);

                jkl=1;

            }

        }

        if(jkl==0) printf("\n");

        printf("\n");

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值