某部队进行新兵队列训练, 将新兵从一开始按顺序依次编号, 并排成一行横队, 训练的
规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠 拢,再从头开
始进行一至三报数, 凡报到三的出列, 剩下的向小序号方向靠拢, 继续从头开始进行一至二
报数。。。, 以后从头开始轮流进行一至二报数、一至三报 数直到剩下的人数不超过三人为止。
★数据输入
第一行为组数 N,接着为 N 行新兵人数,新兵人数不超过 5000。
★数据输出
共有 N 行, 分别对应输入的新兵人数, 每行输出剩下的新兵最初的编号, 编号之间有一
个空格。
输入示例 输出示例
2 1 7 19
20 1 19 37
40
#include<stdio.h>
void p1(int n,int arr[],int &sum);
void p2(int n,int arr[],int &sum)
{ int i;
if(n<=3)
{
sum=n;
for(i=0;i<n;i++)
arr[i]=i+1;
return;
}
p1(n-(n/2),arr,sum);
for(i=0;i<sum;i++)
arr[i]=(arr[i]+arr[i]-1);}
void p1(int n,int arr[],int &sum)
{ int i;
if(n<=3)
{
sum=n;
for(i=0;i<n;i++)
arr[i]=i+1;
return; }
p2(n-(n/3),arr,sum);
for(i=0;i<sum;i++)
arr[i]=(arr[i]+(arr[i]-1)/2);}
int main()
{ int num,row,arr[3],sum,i;
scanf("%d",&row);
while(row--)
{ scanf("%d",&num);
arr[0]=arr[1]=arr[2]=0;
p2(num,arr,sum);
for(i=0;i<sum-1;i++)
printf("%d ",arr[i]);
printf("%d\n",arr[sum-1]);
}
return 0;
}