POJ 1595 素数切

来源:互联网 发布:如何让皮肤变好 知乎 编辑:程序博客网 时间:2024/04/30 01:02

题目没什么,1A过,关键要把弄懂题意,英文差的孩子是伤不起额...

题意:给定你一个数n,让你求出1-n内有多少个素数,再给你一个数d,如果2*d大于素数的个数则全部输出;

否则,如果个数为单数,输出2*d - 1个并且以中间那个素数为中心分别向两边输出d-1个;

如果偶数个,输出2*d个,也是以中间那个素数为中心向两边扩展;

#include<iostream>
#include<cstdio>
using namespace std;
#define manx 10000
bool s[manx];
int num,p[manx],x[manx];  /// x[i] 是用来记录当前1 ~ i包括1在内的质数的个数,可以打印看看..
void prime(){
    memset(s,0,sizeof(s));
    memset(x,0,sizeof(x));
    for(int i=2;i*i<=manx;i++){
        if(!s[i]){
            for(int j=2;j*i<manx;j++){
                s[i*j]=1;
            }
        }
    }
    p[0]=1;  num=1;  x[1]=1;
    for(int i=2;i<manx;i++){
        if(!s[i]){
            p[num++]=i;
            x[i]=x[i-1]+1;
            continue;
        }
        x[i]=x[i-1];
    }
}
int main(){
    int n,c;
    prime();
    while(cin>>n>>c){
        int d=c*2;
        printf("%d %d:",n,c);
        if(d>=x[n]){
            for(int i=0;i<x[n];i++)
                printf(" %d",p[i]);
        }
        else {
            if(x[n]%2==0){
                for(int i=(x[n]-d)/2;i<x[n]-(x[n]-d)/2;i++)
                    printf(" %d",p[i]);
            }
            else{
                for(int i=(x[n]-d+1)/2; i<x[n]-(x[n]-d+1)/2 ;i++){
                    printf(" %d",p[i]);
                }
            }
        }
        printf("\n\n");
    }
}