龙姑娘  

Description

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
 

Input

本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
 

Output

共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
 

Sample Input

2 20 40
 

Sample Output

1 7 19 1 19 37
 
 
 
 
解题思想:
使用数组与循环,判断数组报到了相应数字该下标赋值为零,然后删除数组内所有的零,再继续循环直到人数为三跳出循环。
 
 
代码如下:
 

#include "stdio.h"
int main()
{
 int a[5000],i,j=0,n=0,m,x,z=0,ci;

 scanf("%d",&ci);
 while(ci--)
        { scanf("%d",&m);
            for(i=0;i<m;i++)
  a[i]=i+1;

 while (m>3)
 {

  for(i=0;i<m;i++)
  {
   n++;
   if(n==2)
   {  a[i]=0;  n=0; }

  }

  for(i=0;i<m-z;i++)
  {  if(a[i]!=0) j++;
  else
  {
   for(x=j;x<m;x++)
    a[x]=a[x+1];
   z++;j++;
  }
  }
  m=m-z;n=0;j=0;z=0;

  if(m<=3) break;
  for(i=0;i<m;i++)
  {
   n++;
   if(n==3)
   {  a[i]=0;n=0; }

  }


  for(i=0;i<m-z;i++)
  {
   if(a[i]!=0) j++;
   else
   {  for(x=j;x<m;x++)
   a[x]=a[x+1];
   z++; j++;
   }
  }
        m=m-z;n=0;j=0;z=0;
 }
 for(i=0;i<m;i++)
  {printf("%d",a[i]);
  if(i<m-1) printf(" ");}
  printf("\n");}

 

 return 0;

}

 
 
posted on 2016-07-17 18:43  龙姑娘  阅读(124)  评论(0编辑  收藏  举报