#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <Windows.h>
//2023年5月22日07:18:17 学习练习此题
/*
编程时间:有n个人围成一圈,顺序排号约瑟夫环(喝酒退出游戏)。
从第一个人开始报数(1-3报数),凡事报到3(赋值为0)退出圈子,问最后留下的是原来的第几号位置的人。
*/
int main(void)
{
int PaiHao[100] = {1,1,1,1};//随机声明,实际值由下面的for循环遍历赋值为1
for (int i = 1; i <= 12; i++)
{
PaiHao[i] = 1; //参与的人数都对号入座;
printf("%-4d", PaiHao[i]);
}
printf("\n");
int count = 12;
int baoShu;
int XiaBiao;
//第一个人位置、报数号
XiaBiao = 0;
baoShu = 0;
第二个人位置、报数号
//XiaBiao++;
//baoShu++;
第二个人位置、报数号
//XiaBiao++;
//baoShu++;
while (count > 0)
{
XiaBiao++;
baoShu++;
while (PaiHao[XiaBiao] == 0) //等于0的那个人退出(喝趴了)
{
XiaBiao++; //下一个人开始
if (XiaBiao > 12) //判断一轮是否结束
{
XiaBiao = 1;//如果结束(下标值赋值为0)轮完一轮从第一个从头开始再来寻找没喝酒的人完
}
}
if (baoShu == 3) //谁报数为3的,直接赋值为0;喝酒喝趴了
{
//将喊了3的下标赋值为0(下次碰到了直接下一个)并且打印
PaiHao[XiaBiao] = 0;
printf("%-4d", XiaBiao);//谁需要喝酒,按顺序 打印他的位置
count--; //人数减一
baoShu = 0; //报数为0,刷新
}
}
return 0;
}
运行结果如下: