http://poj.org/problem?id=1595
加深理解下面求素数的方法
素数筛法是这样的:
1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false.
2.然后:
for(i=3;i<=tmp;i++) { if(prime[i]) { for(j=i+i;j<=MAXN;j+=i) prime[j]=false; } } prime[1]=true; prime[2]=true;
3.最后输出bool数组中的值为true的单元的下标,就是所求的n以内的素数了。
原理很简单,就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质
数的倍数筛掉。
Time Limit: 1000MS | Memory Limit: 10000K | |
Description
Input
Output
Sample Input
21 2 18 2 18 18 100 7
Sample Output
21 2: 5 7 11 18 2: 3 5 7 11 18 18: 1 2 3 5 7 11 13 17 100 7: 13 17 19 23 29 31 37 41 43 47 53 59 61 67
/* Author : yan * Question : POJ 1595 Prime Cuts * Data && Time : Friday, January 07 2011 01:53 PM */ #include<stdio.h> #define MAXN 1003 #define bool _Bool #define false 0 #define true 1 bool prime[MAXN]={false}; int stack[MAXN]; int top; int num_prime(int to) { int _i; top=0; for(_i=1;_i<=to;_i++) if(prime[_i]) stack[top++]=_i; return top; } int main() { //freopen("input","r",stdin); int i,j,n,c; int num_p; for(i=2;i<=MAXN;i++) { if(i%2) prime[i]=true; //else prime[i]=false;//初始值就是false,可以省略 } int tmp=(int)sqrt(MAXN); for(i=3;i<=tmp;i++) { if(prime[i]) { for(j=i+i;j<=MAXN;j+=i) prime[j]=false; } } prime[1]=true; prime[2]=true; // int index; while(scanf("%d %d",&n,&c)!=EOF) { num_p=num_prime(n); printf("%d %d: ",n,c); if(num_p%2) { index=(num_p+1)/2; if(index-c+1>0) for(i=index-c;i<=index+c-2;i++) printf("%d ",stack[i]); else for(i=0;i<top;i++) printf("%d ",stack[i]); } else { if(num_p/2>c) for(i=num_p/2-c;i<num_p/2+c;i++) printf("%d ",stack[i]); else for(i=0;i<top;i++) printf("%d ",stack[i]); } printf("/n/n"); } //printf("%d/n",num_prime(10)); return 0; }