有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.
约瑟夫问题,基于数组实现
具体的解释都已注释
不懂得可以留言评论区
#include <stdio.h>
int main()
{
int person_num; //输入的人数
int person; //复制输入的人数,用作运算,不改变person_sum
int flag[100] = {0}; //全部值初始化为0,报数报到3的人置为1
int i = 1; //人数从1开始编号
int k = 0; //计数,每到3则那个人出列
printf("请输入人数:");
scanf("%d", &person_num);
person = person_num;
while (person > 1)
{
if (flag[i] == 0)
{
k++;
}
if (k == 3) //报到3的人出列
{
k = 0;
flag[i] = 1; //置1
person--;
}
i = i % person_num + 1; //每次循环到最后一个人,从头开始
}
for (int i = 1; i <= person_num; i++)
{
if (flag[i] == 0)
{
printf("%d\n", i);
}
}
return 0;
}