筛选法求素数

来源:互联网 发布:宁海知豆招聘 编辑:程序博客网 时间:2024/06/05 23:41

3749: 筛选法求素数 分享至QQ空间 去爱问答提问或回答

Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByte
Total Submit: 544            Accepted:164

Description

请使用筛选法输出[a, b]之间的所有素数。

Input

输入数据有多组,每组数据占一行,每行2个正整数a和b,其中2<=a<=b<=1000000。

Output

每组数据按从小到大的顺序输出[a, b]中所有的素数,每行最多输出10个素数。每组数据之后空一行。

Sample Input

2 32 50

Sample Output

2 32 3 5 7 11 13 17 19 23 2931 37 41 43 47

Source

TOJ


题目分析:

由于数据规模较大,常规的逐个判断素数的方法行不通,所以用筛选法进行预处理处理,一次性将所有的素数存入一个数组里。

主要思想:

1.将1-N中的所有数都标记为素数(0 表示为素数,1不是素数)

2.1不是素数,也不是合数,筛掉(即标记为1)。

3.2为素数保留,但比2大的所有的2的倍数都筛掉,直到大于N为止。

4.继续寻找素数标记,找到3,将其保留,筛掉此后所有3的倍数,直到大于N为止。



代码:

#include<stdio.h>#define N 1000000int x[N+1] = {1};void Genprime()//筛选法的函数 {int temp,n,i;x[0] = x[1] = 1;for(i = 2; i <= N; i++){if(x[i] == 0){temp = i * 2;while(temp <= N){x[temp] = 1;temp+= i; }}}}int main(){int a,b,flag,num = 0,i;Genprime();while(scanf("%d%d",&a,&b)!=EOF){num = flag = 0;for(i = a; i <= b; i++){if(x[i] == 0){num++;//记录输出的是第几个 if(num%10 == 1&&flag == 0){flag = 1;printf("%d",i);}else if(num%10== 0&&flag){flag = 0;//flag 作为换行的标志 printf("%d\n",i);}else printf(" %d",i);}}printf("\n\n");}}




0 0