题意: 给定一个数字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;
}