In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros
Party has decided on the following strategy. Every day all dole applicants will be placed in a large
circle, facing inwards. Someone is arbitrarily chosen as number 1, and the rest are numbered counter
clockwise up to
N
(who will be standing on 1’s left). Starting from 1 and moving counter-clockwise,
one labour official counts off
k
applicants, while another official starts from
N
and moves clockwise,
counting
m
applicants. The two who are chosen are then sent off for retraining; if both officials pick
the same person she (he) is sent off to become a politician. Each official then starts counting again
at the next available person and the process continues until no-one is left. Note that the two victims
(sorry, trainees) leave the ring simultaneously, so it is possible for one official to count a person already
selected by the other official.
Input
Write a program that will successively read in (in that order) the three numbers (
N
,
k
and
m
;
k, m >
0
,
0
< N <
20
) and determine the order in which the applicants are sent off for retraining. Each set of
three numbers will be on a separate line and the end of data will be signalled by three zeroes (
0 0 0
).
Output
For each triplet, output a single line of numbers specifying the order in which people are chosen. Each
number should be in a field of 3 characters. For pairs of numbers list the person chosen by the counter
clockwise official first. Separate successive pairs (or singletons) by commas (but there should not be a
trailing comma).
Note:
The symbol
⊔
in the Sample Output below represents a space.
Sample Input
10 4 3
0 0 0
Sample Output
␣␣4␣␣8,␣␣9␣␣5,␣␣3␣␣1,␣␣2␣␣6,␣10,␣␣7
#include<stdio.h>
#include<string.h>
int main()
{
int n, m, k;
int a[100] = { 0 }, book[100] = { 0 };
while (scanf("%d%d%d", &n, &m, &k) && n && m && k)
{
memset(book, 0, sizeof(book));
int head = 1;
//表示第一个official开始数人的开头,起始是从第一个人开始数
int end = n;
//表示第二个official开始数人的开头,也就是最后一个
int temp = n;
while (temp != 0)
{
int num = 0;
int t1, t2;
//开始第一个official的循环
for (int i = head;i <= n;i++)
{
if (book[i] == 0)
{
num++;
if (num == m)//以m为一个周期
{
t1 = i;
num = 0;
//循环完成,要有好的习惯,将其归零
break;
}
}
if (i == n)
{
i = 0;
}
//这个if语句主要是防止还没数到第m个就已经跳出循环
}
//开始第二个official的循环,与第一个是相同的操作,我就不在赘述了(^v^)偷个懒
for (int i = end;i >= 1;i--)
{
if (book[i] == 0)
{
num++;
if (num == k)
{
t2 = i;
num = 0;
break;
}
}
if (i == 1)
{
i = n + 1;
}
}
//循环结束后记得将head,end跟新为当前位置
head = t1;
end = t2;
//t1,t2代表的是选出的那两个人,应在循环结束后将其的状态定为已经被选走
book[t1] = 1;
book[t2] = 1;
//t1和t2相等temp只用减去一个人数,不相等则减去两个
if (t1 == t2)
{
printf("%3d", t1);
temp--;
}
else
{
printf("%3d%3d", t1, t2);
temp -= 2;
}
//最后一组被选出的末尾不用加逗号
if (temp != 0)
printf(",");
}
printf("\n");
}
return 0;
}