yigelaichi

导航

 

2017.12.23

 

某部队进行新兵队列训练,

从一开始按顺序依次编号,

将新兵并排成一行横队,

训练的规则如下:

从头开始一至二报数,凡报到二的出列,

剩下的向小序号方向靠拢,

再从头开始进行一至三报数,

凡报到三的出列,剩下的向小序

号方向靠拢,继续从头开始进行一至二报数。

.......

以后从头开始轮流进行一至二报数、

一至三报数直到剩下的人数不超过三人为止。

 

要求:

数据输入:

本题有多个测试数据

第一行为组数N,接着为N行新兵人数,

新兵人数不超过5000

数据输出:

共有N 行,分别对应输入的新兵人数,

每行输出剩下的新兵最初的编号,

编号之间有一个空格。

 

样例输入

2

20

40

样例输出

1 7 19

1 19 37

#include<stdio.h>

void sha(int n)

{     int i,k;    

int a[n],b[n];    

int c=1,j;    

for(i=0;i<n;i++,c++)    

a[i]=c;

    for(k=1;;k++)

 {

       if(n<=3)        

break;        

j=0;

    for(i=0;i<n;i++)    

{

        if( k%2 == 1 )       

  {            

if( (i+1) % 2 != 0)            

{               

b[j]=a[i];                

j++;               

}

         }       

if( k%2 == 0)        

  {            

if( (i+1) % 3 != 0)            

  {               

b[j]=a[i];                

j++;             

}        

  }    

}

       n=j;

    for(i=0;i<n;i++)       

a[i]=b[i];   

  if(j==2||j==3)    

for(i=0;i<n;i++)    

printf("%d  ",a[i]);

}

}

int main()

{     int i;    

int n;    

scanf("%d",&n);

    int a[n];   

  for(i=0;i<n;i++)    

scanf("%d",&a[i]);

    for(i=0;i<n;i++)    

{     

sha(a[i]);     

printf("\n");     

}

    return 0;

}

posted on 2017-12-24 00:07  yigelaichi  阅读(91)  评论(0)    收藏  举报