這題的痛點在於: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;elsebreak;}}cout<<endl<<endl; //每行輸出後有一空行}return 0;}