码迷,mamicode.com
首页 > 编程语言 > 详细

Pascal语言中的约瑟夫问题:幸运观众

时间:2015-02-26 20:08:37      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:

【题目】节目主持人准备从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. 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 来重新报数:
  1. for i:=1 to n do a[i]:=a[i] div 2;
是不是豁然开朗了呢?

 

Pascal语言中的约瑟夫问题:幸运观众

标签:

原文地址:http://www.cnblogs.com/RhinoC/p/4301965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!