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

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");//按格式输出 
    }       
}

你可能感兴趣的:(POJ 1595 && HDU 1319 Prime Cuts(数论))