poj1595 prime cuts(快速筛选)

来源:互联网 发布:收入影响因素数据图表 编辑:程序博客网 时间:2024/06/04 23:33

题意:  给定一个数字N,将1到N中的所有质数按照中心值为c的规定输出,规则详见题目。

本题不难,但是要注意这里1也算是素数列中的一员。其它的都是小事儿啦,用快速筛选找到1--1000内所有的素数和合数。然后A了。

#include <iostream>#include<cstdio>using namespace std;bool notpri[1001];int prime[1001],cnt=0;void getprime(){  //快速筛选。   int i,j;   prime[++cnt]=1;   for(i=2;i<=1000;i++){      if(!notpri[i])prime[++cnt]=i;      for(j=2;j<=cnt&&prime[j]*i<=1000;j++){        notpri[prime[j]*i]=1;        if(i%prime[j]==0)break;      }   }}int prisum[1001];  //记录前N个数字里有多少个素数。void stat(){    int t=2;    prisum[1]=1;    prisum[2]=2; // 1 is a primer    for(int i=3;i<=1000;i++){        if(!notpri[i])t++;        prisum[i]=t;    }}int main(){    getprime();    stat();    int N,C;    while(~scanf("%d%d",&N,&C)){        int sum,i;        //cout<<prisum[N]<<endl;        if(prisum[N]%2)sum=2*C-1;        else sum=2*C;        printf("%d %d: ",N,C);        if(sum>=prisum[N])        for(i=1;i<=prisum[N];i++){            printf("%d ",prime[i]);        }        else {            int start=(prisum[N]-sum)/2+1;  //设置print的起点            for(i=start;i<start+sum;i++){                printf("%d ",prime[i]);            }        }        printf("\n\n");    }    return 0;}



0 0
原创粉丝点击