POJ 1595 Prime Cuts

来源:互联网 发布:手机学全站仪的软件 编辑:程序博客网 时间:2024/06/17 15:58

题意:输入n,c。如果小于等于n的素数个数为奇数,从中间的素数向两边扩张,输出2*c-1个素数;若为偶数个,输出最中间的2*c个。如果小于等于n的全部素数小于等于2*c 或 2*c-1 ,则输出全部素数。

思路:打两个表,第一个记录素数,第二个记录从1到n素数的个数。然后根据根据素数个数的奇偶输出即可。这题很坑爹的一个地方就是,题目明明说了n<=1000,测试的数据却超了1000!看了discuss,把数组改到1200过了。囧。。。。

AC代码

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<iomanip>#include<algorithm>#include<cmath>using namespace std;int prime[400];int vis[1205];int sum[1205];void get_prime(){    prime[0]=1;    memset(vis,0,sizeof(vis));    memset(sum,0,sizeof(sum));    sum[1]=1;    int cnt=1;    for(int i=2; i<1200; i++)    {        if(!vis[i])        {            sum[i]=sum[i-1]+1;            prime[cnt++]=i;            for(int j=i*2; j<1001; j+=i)                vis[j]=1;        }        else sum[i]=sum[i-1];    }}int main(){    get_prime();    int n,c,i;    while(cin>>n>>c)    {        cout<<n<<" "<<c<<":";        if(sum[n]%2==0)        {            if(sum[n]<=2*c)            {                for(i=0; prime[i]<=n; i++)                    cout<<" "<<prime[i];                cout<<endl<<endl;            }            else            {                int tmp=sum[n]/2;                for(i=tmp-c; i<tmp+c; i++)                {                    cout<<" "<<prime[i];                }                cout<<endl<<endl;;            }        }        else        {            if(sum[n]<=2*c-1)            {                for(i=0; prime[i]<=n; i++)                    cout<<" "<<prime[i];                cout<<endl<<endl;            }            else            {                int tmp=sum[n]/2;                for(i=tmp-c+1; i<tmp+c; i++)                {                    cout<<" "<<prime[i];                }                cout<<endl<<endl;            }        }    }    return 0;}


0 0
原创粉丝点击