这道题我觉得是个简单的模拟题,整理一下思路,弄清楚题意就好了。
新手上路,采用两个数组进行交互赋值,用的方法也比较笨,思路差不多都在代码的注释里了。
下面是题目大意:
首先将士兵从1开始编号(士兵总数不超过5000),然后开始1 2 1 2...报数,报到2的士兵出列,剩下的向小序号方向靠拢,然后按照1 2 3 1 2 3... 报数,报到3的出列。以此类推(1 2 1 2...报数后再1 2 3 1 2 3...报数),直到剩下的士兵人数不超过3人,并且输出他们原来的编号。
格式要求如下:
第一行表示的是一个测试组数N,下面N行是每个案例士兵人数。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
1 #include<iostream> 2 #include<string.h> 3 using namespace std; 4 5 int n,N,i,j,a[5001],b[5001],c;//我一般比较喜欢定义为全局变量 6 7 int main() 8 { 9 cin >> N; 10 while(N--) 11 { 12 memset(a,0,sizeof(a));//初始化一下两个要用到的数组 13 memset(b,0,sizeof(b)); 14 cin >> n; 15 for(i=1;i<=n;i++) 16 a[i]=i;//为n个新兵进行编号 17 while(n>3)//人数大于3的时候执行循环内的语句 18 { 19 for(i=1,j=1;i<=n;i++) 20 { 21 if(i%2!=0)//1 2 1 2...报数导致a数组下标为偶数的全报的2,应当剔除 22 { 23 b[j]=a[i];//把a数组内下标为奇数的数放到b数组内 24 j++; 25 } 26 } 27 c=j-1;//j在执行完最后一个赋值后,又执行了一次j++,所以留下的士兵应该为j-1 28 if(c<4)//如果满足条件,直接输出,结束此次循环 29 { 30 for(i=1;i<c;i++) 31 cout<<b[i]<<' '; 32 cout<<b[c]<<endl; 33 break; 34 } 35 for(j=1,i=1;j<=c;j++)//1 2 3 1 2 3...报数 36 { 37 if(j%3!=0) 38 { 39 a[i]=b[j];//把b数组内下标为3的倍数的数放到a数组内 40 i++; 41 } 42 } 43 n=i-1;//同上面的c=j-1; 44 } 45 if(n<4) 46 { 47 for(i=1;i<n;i++) 48 cout<<a[i]<<' '; 49 cout<<a[n]<<endl; 50 } 51 } 52 return 0; 53 }