设为首页 加入收藏

TOP

HDU 1319 Prime Cuts
2014-11-24 00:04:19 来源: 作者: 【 】 浏览:17
Tags:HDU 1319 Prime Cuts

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

AC代码:
[cpp]
#include
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<
if(c>=count)
{ //这个括号没打,输出结果莫名奇妙!!!
for(i=1;i<=n;i++)
if(prime[i])
cout<<" "< }
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<<" "< else
break;
}
}
cout< }

return 0;
}


摘自 ON THE WAY

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Hdu 2546 饭卡(DP_背包) 下一篇深拷贝与浅拷贝探析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: