HDU 1319 Prime Cuts
这题的难点在于: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