HDOJ 1319 Prime Cuts<数论>

来源:互联网 发布:开淘宝网店的照片要求 编辑:程序博客网 时间:2024/06/01 08:43

学会了不难。通过这道题学习了两点:

1:筛选法求素数。

2:在写比较长的程序的时候,给每个功能部分加上注释,思路会更清晰。

题意:

1.题目中所说的素数并不是真正的素数,包括1;

2.需要读懂题意,对于输入的n和c,如果1到n之间有偶数个素数则打印2c个数,奇数个素数则打印2c-1个数;

3.打印的数是所有素数中位于中间位置的那些数。

4.虽然数据量n<100.但是应确定第100+个素数是那个数,稍微把数组开大一些。

#include<iostream>#include<cstdio>#include<cmath>using namespace std;const int maxn=1050;bool isprime[maxn];int prime[200];//筛选法求素数void Erato(){    isprime[0]=false;    isprime[1]=true;    isprime[2]=true;    //初始化    for(int i=3;i<maxn;i++){        isprime[i++]=true;//奇数        isprime[i]=false;//偶数    }    //判断素数    int n=sqrt(maxn);    for(int i=3;i<=n;i+=2)        for(int j=i+i;j<maxn;j+=i)            isprime[j]=false;    //将素数方如prime中,包括1    prime[0]=1;    prime[1]=2;    int j=2;    for(int i=3;i<maxn;i+=2)        if(isprime[i])            prime[j++]=i;}int main (){    Erato();    int n,c,count;    int printcount,str,end;    while(~scanf("%d%d",&n,&c))    {        printf("%d %d:", n, c);        count=0;        int i=0;        //统计素数的个数        while(prime[i++]<=n)            count++;        //统计要打印素数的个数        if(count%2)            printcount=2*c-1;        else            printcount=2*c;        // 计算数据的起始与终止位置        if(printcount>=count)            str=0,end=count-1;        else{            str=(count-printcount)/2;            end=str+printcount-1;        }        for(int i=str;i<=end;i++)            printf(" %d",prime[i]);        printf("\n\n");            }    return 0;}


0 0
原创粉丝点击