题目
n(n<20)个人站成一圈,逆时针编号为1~n。有两个官员,A从1开始逆时针数,B从n开 始顺时针数。在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个 官员停在同一个人上)。接下来被官员选中的人(1个或者2个)离开队伍。
输入n,k,m输出每轮里被选中的人的编号(如果有两个人,先输出被A选中的)。例 如,n=10,k=4,m=3,输出为4 8, 9 5, 3 1, 2 6, 10, 7。注意:输出的每个数应当恰好占3列。
Input:
10 4 3
Output:
4 8, 9 5, 3 1, 2 6, 10, 7
分析
1.用一个大小为n的数组来表示一个头尾相接的圈。
2.被AB官员选中的人要离开队伍,我们直接做标记就行了,比如让他的值等于0。选人的时候要跳过这些已经被选中过的人(值为0的)。AB官员有可能选中同一个或者不同个,这个要注意点。
核心
官员怎么顺时针和逆时针选人。
比如A官员是从1逆时针数,数4个就停。(要注意的是:从1开始但1要算,就是把1算进来走4个,结果走到4)
我们一步一步走,走够4次就停住,要跳过等于0的数字。
while(步数--)
{
do
{
p = (p + d + n -1)%n + 1; //这个是难点,p是当前数字