HDU 1319 Prime Cuts

这题的难点在于:1、你得理解题意;2、你要处理繁琐的控制。从哪里开始输出,到哪里结束;每个数之前的空格,每行之后的空行等等

题意:输入n、c。n为可能的素数的上限,输出素数个数则要根据1---n内素数的个数决定。若素数个数为偶数,则输出2*c个数;反之,输出2*c-1个数。并且,要从1---n中

素数的中间向两边扩展,换句话也就是两头为输出的素数的个数要尽量相等,如不能做到,前面的要比后面的少一个。另外,还有特例,就是如果要输出的素数个数大于

1---n内的素数总数,就全输出。

注意:在该题中1也是素数!

 

AC代码:

#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;
}


 

 

 

 

 

你可能感兴趣的:(c,扩展)