基本思路
1、假设每次报的数为curNum,初始为0;当前报数人的编号为index,初始为0;在列人数remain初始为n;number表示成员的编号;status表示该成员当前是否在列,0:出局,1:在列。
2、每次index前进1:index =(index+1)%n,类似循环队列的操作方式。每次不管指向的报数者是否在列,都要前进1。
3、num赋值:当前报数者在列,报数+1;如果num=k,那么此人应该出列,剩余人数减1,且将其状态置为出列。从下一个人开始,又要从1开始报数,那么num应该重置为0。
4、当剩余0人时游戏结束。
代码
typedef struct {
int status;
int number;
} Member;
void ReportNum(int n, int k) {
int remain = n, curNum = 0, index = 0;
Member member[n];
for (int i = 0; i < n; ++i) {
member[i].status = 1;
member[i].number = i + 1;
}
while (remain > 0) {
if (member[index % n].status == 1) {
curNum++;
if (curNum == k) {
member[index % n].status = 0;
printf("%d出局\n", member[index % n].number);
remain--;
curNum = 0;
}
}
index++;
}
}
运行
ReportNum(11, 3);