您的位置:首页 > 其它

POJ 1595 && HDU 1319 Prime Cuts(数论)

2015-08-25 10:40 323 查看
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");//按格式输出
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: