士兵队列训练问题

来源:互联网 发布:淘宝指数 编辑:程序博客网 时间:2024/05/11 12:37
★实验任务
某部队进行新兵队列训练, 将新兵从一开始按顺序依次编号, 并排成一行横队, 训练的
规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠 拢,再从头开
始进行一至三报数, 凡报到三的出列, 剩下的向小序号方向靠拢, 继续从头开始进行一至二
报数。。。, 以后从头开始轮流进行一至二报数、一至三报 数直到剩下的人数不超过三人为止。
★数据输入
第一行为组数 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;
}
       

0 0