/***********************
题目大意:找出1-N之间的素数(此题中1也算做素数)组成一列数,假设素数的个数为NUM,若NUM为奇数时输出2*C-1个数(这些数为从此列中间位置向两边展开的到的2*C-1数),若NUM为偶数时输出2*C个数(这些数为从此列中间位置向两边展开的到的2*C数);
题目解析:运用筛选法先求出,1—1000之间的素数,存放在数组此c1中,再在输入的n,c情况下,计算1-n之间的素数的个数,判断其奇偶性,然后根据要求输出;
若为奇数则输出数组c1下标(NUM+1)/2-c+1到(Num+1)/2+c-1之间素数,若为偶数则输出数组c1下标NUM/2-c+1到Num/2+c之间素数;
易错分析:当c大于N时输出全部素数;
*************************/
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i,j,k=2,n,c,prime[1000],c1[1000];
//prime[i]只是标记,c1数组存储所有素数
memset(prime,0,sizeof(prime));
c1[1]=1;
for(i=2;i<=1000;i++)
//可以放在while的外面,可以随时取出,减少循环次数,
{
if(!prime[i])
{
c1[k++]=i;
for(j=2*i;j<=1000;j+=i)
prime[j]=1;
}
}
while(scanf("%d %d",&n,&c)!=EOF)
{
i=0;
while(n>=c1[++i]);
printf("%d %d:",n,c);
if(c>(i-1)/2)
//当c大于N时输出全部素数;
{
for(j=1;j<i;j++)
printf(" %d",c1[j]);
}
else
//当c小于N时按照要求输出;
if((i-1)%2==0)
//素数个数为偶数则输出数组c1下标NUM/2-c+1到Num/2+c之间素数;
{
for(j=(i-1)/2-c+1;j<=(i-1)/2+c;j++)
printf(" %d",c1[j]);
}
else
//素数个数为奇数则输出数组c1下标(NUM+1)/2-c+1到(Num+1)/2+c-1之间素数
{
for(j=i/2-c+1;j<=i/2+c-1;j++)
printf(" %d",c1[j]);
}
printf("\n\n");
}
return 0;
}