约瑟夫生者死者小游戏
问题描述:
30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
运行结果:
代码实现:
#include<stdio.h>
void fun()
{
int arr[30];
int counter = 15; // 计数器
int length = 30;
// 1.进行编号
for (int i = 0; i <= 29; i++) arr[i] = i + 1;
// 2.开始淘汰人
int index = 0;
while (counter) {
index = (index + 8) % length; // 计算出被淘汰者结点下标
printf("[%d]", arr[index]);
// 数组arr从下标i开始整体向前移动一位
for (int i = index+1;i<=length-1;i++)
arr[i - 1] = arr[i];
length--; // 数组长度减一
counter--;
}
}
int main()
{
fun();
return 0;
}