HDU 1319 Prime Cuts

来源:岁月联盟 编辑:猪蛋儿 时间:2012-05-29

这题的难点在于:1、你得理解题意;2、你要处理繁琐的控制。从哪里开始输出,到哪里结束;每个数之前的空格,每行之后的空行等等
题意:输入n、c。n为可能的素数的上限,输出素数个数则要根据1---n内素数的个数决定。若素数个数为偶数,则输出2*c个数;反之,输出2*c-1个数。并且,要从1---n中
素数的中间向两边扩展,换句话也就是两头为输出的素数的个数要尽量相等,如不能做到,前面的要比后面的少一个。另外,还有特例,就是如果要输出的素数个数大于
1---n内的素数总数,就全输出。
注意:在该题中1也是素数!
 
AC代码:
[cpp]
#include<iostream> 
using namespace std; 
 
bool prime[1001]; 
 
void judge()   //找素数 

    memset(prime,false,sizeof(prime)); 
 
    bool flag; 
    int tmp; 
    for(int i=1;i<=1000;i++) 
    { 
        flag=true; 
        tmp=(i+1)/2; 
        for(int j=2;j<=tmp;j++) 
        { 
            if(i%j==0) 
            { 
                flag=false; 
                break; 
            } 
        } 
        if(flag) 
            prime[i]=true; 
    } 

         
int main() 

    judge(); 
 
    int n,c,i,count,tmp,rem; 
 
    while(cin>>n>>c) 
    { 
        rem=c; 
 
        count=0; 
        for(i=1;i<=n;i++)   //统计1-n内的素数个数 
        { 
            if(prime[i]) 
                count++; 
        } 
 
        c*=2; 
        if(count%2!=0)   //确定输出个数,如果1-n间的素数个数为奇,打印2*c-1个 
            c--; 
 
        cout<<n<<" "<<rem<<":";   //格式 
 
        if(c>=count) 
        {                     //这个括号没打,输出结果莫名奇妙!!! 
            for(i=1;i<=n;i++) 
                if(prime[i]) 
                    cout<<" "<<i; 
        } 
        else 
        { 
            rem=0; 
            tmp=(count-c)/2;   //找到不能打印的所有素数 
            for(i=1;i<=n;i++) 
            { 
                if(prime[i]) 
                { 
                    rem++; 
                    if(rem==tmp) 
                    { 
                        rem=i;   //记录最后一个不能打印的素数位置 
                        break; 
                    } 
                } 
            } 
 
            tmp=0; 
            for(i=rem+1;i<=n;i++)  //从下一个位置开始找素数 
                if(prime[i]) 
                { 
                    tmp++; 
                    if(tmp<=c)   //打印c个即可 
                       cout<<" "<<i; 
                    else 
                        break; 
                } 
        } 
        cout<<endl<<endl;  //每行输出后有一空行 
    } 
 
    return 0; 

 


摘自 ON THE WAY

图片内容