【题目】节目主持人准备从n名学生中挑选一名幸运观众,因为大家都想争当幸运观众,老师只好采取这样的办法:全体同学站成一列,由前面往后面依顺序报数。1,2,1,2……报单数的同学退出队伍,剩下的同学向前靠拢后,再重新由前往后1,2,1,2……报数,报单数者退出队伍,如此下去最后剩下一人为幸运观众。编程找出幸运观众,在原队列中站在什么位置上?(n由键盘输入,n<255)
【上手】
首先可以先打下草稿:这里假设有6位学生(出列学生用0代替)
一开始的位置:[1] [2] [3] [4] [5] [6]
第一轮报数: 1 2 1 2 1 2
第一轮筛选: 0 [2] 0 [4] 0 [6]
第二轮报数: 0 1 0 2 0 1
第二轮筛选: 0 0 0 [4] 0 0
-------------------------------------------------------------------
一开始我的思路是把非0的号码填充到0,后面想到可以直接提取所有非零号码直接代替原数组。
代码如下:
-
1 for i:=1 to n do 2 if a[i]<>0 then 3 begin 4 inc(j); 5 b[j]:=a[i]; 6 end;
-
这的确是一个方法但我个人觉得略显繁琐,那么我们再仔细看一看先前打的草稿,是不是发现了什么?
对,我们可以直接调用 div 来重新报数:
-
for i:=1 to n do a[i]:=a[i] div 2;
是不是豁然开朗了呢?