2011年8月3日 星期三

[ACM 406] Prime Cuts

 內容 :
質數的定義為:除了1和它本身之外,沒有別的數可以整除它的。(請注意:在本問題中,1被定義為質數)
你的任務是,給你N及C,請你找出1到N中所有的質數,並把他們排成一列(假設共有K個)。如果K是偶數,請輸出中間那C*2個質數。如果K是奇數,則輸出中間那(C*2)-1個質數。


輸入說明 :
每組測試資料一列,各含有2個整數N,C。(1 <= N <= 1000, 1<= C <= N)
輸出說明 :
對每組測試資料輸出N C:,然後輸出題目要求的質數。每個數前方有一空格。 如果2*C或(2*C)-1大於等於K,就把他們全部列出(如第3個sample)。每組測試資料後亦請空一列。請參考Sample Output。
範例輸入 :
21 2
18 2 
18 18
100 7

範例輸出 :
21 2: 5 7 11

18 2: 3 5 7 11 18

18: 1 2 3 5 7 11 13 17

100 7: 13 17 19 23 29 31 37 41 43 47 53 59 61 67





/**********************************************************************************/
/*  Problem: c033 "Prime Cuts" from ACM 406                                       */
/*  Language: C                                                                   */
/*  Result: AC (30ms, 364KB) on ZeroJudge                                         */
/*  Author: diiuuli520 at 2008-08-17 03:09:20                                     */
/**********************************************************************************/
#include<stdio.h>
int main ()
{
 int N,c;
 while(scanf("%d%d",&N,&c)!=EOF && N>=1 && N<=1000 && c>=1 && c<=N  )
 {
     int a[178]={0},count=5,j,n,k=4;
     a[0]=1;
     a[1]=2;
     a[2]=3;
     for(j=3;j<=175;j++)
     {  
      a[j]=count;
      for(n=1;n<j;n++)
      {
       if(count%a[n]==0)
       {
        j--;
        break;
       }
      }
         k=6-k;
      count+=k;
     }
  printf("%d %d",N,c);
  int K,q,w,e,s,v;
  printf(":");  
  for(K=0;a[K]<=N;K++)
  {
  }
  if((2*c<K) || (2*c-1)<K)
  {
      if(K%2==1)
      {
           e=(K+1)/2;
   
           for(s=e-c;s<e+c-1;s++)
           { 
            printf("% d",a[s]);
           }
      }
      else if(K%2==0)
      {
        q=K/2;
        for(w=q-c;w<q+c;w++)
        {
         printf("% d",a[w]);
        }
      }
  }
  else if((2*c)>=K || (2*c)-1>=K)
  {
   for(v=0;v<K;v++)
   {
    printf("% d",a[v]);
   }
  }
  printf("\n\n");
  
 }
  
return 0;
 }

沒有留言:

張貼留言