這題的難點在於: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