Description
给定你一个数n,让你求出1-n内有多少个素数,再给你一个数d,如果2*d大于素数的个数则全部输出;否则,如果个数为单数,输出2*d-1个并且以中间那个素数为中心分别向两边输出d-1个;如果偶数个,输出2*d个,也是以中间那个素数为中心向两边扩展
Input
多组输入,每组用例包括两个数n和d,以文件尾结束输入
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
Solution
先用筛选法生成大范围内的素数,关键要注意输出的要求
Code
#include<stdio.h>
#define min(x,y) (x<y?x:y)
#define max(x,y) (x>y?x:y)
int main()
{
int pri[1000],i,j,flag,res,n,m;
pri[1]=1;
pri[2]=2;
res=3;
for(i=3;i<=1101;i+=2)//打表
{
flag=1;
for(j=2;j<=(i+1)/2;j++)
if(i%j==0)
flag=0;
if(flag)//记录素数下标
pri[res++]=i;
}
while(scanf("%d%d",&n,&m)!=EOF)
{
printf("%d %d:",n,m);
for(i=1;pri[i]<=n;i++);//找到n内的素数个数
res=i;
if(res%2==0)//偶数个素数
for(i=max(res/2-m+1,1);i<min(res/2+m,res);i++)
printf(" %d",pri[i]);
else//奇数个素数
for(i=max((res+1)/2-m,1);i<min((res+1)/2+m,res);i++)
printf(" %d",pri[i]);
printf("\n\n");//按格式输出
}
}