经典的约瑟夫出圈问题,具体的就不多说了,由于是用char类型的变量,所以最多只支持128个囚犯的圈圈。(能节省的地方该节省,我是绿色主义者)
#include <stdio.h>
int main()
{
//一共有多少人
char size = 0;
//数到第几个人,由于数组的第一个元素为0,所以从-1开始
char who = -1;
//间隔多少人
char how = 0;
//记录数了个人的
char count = 0;
//循环变量,也表示留多少个活口
char i = 0;
printf("请输入人数:");
scanf("%hhd", &size);
//用字符的最高为表示生死,0为活的,1为处决了的
char person[size];
//给囚犯起名字
for (i = 0; i < size; i++)
{
person[i] = 'a' + 1;
}
printf("请输入间隔:");
scanf("%hhd", &how);
//开始处决囚犯
for (i = 0; i < size; i++)
{
//把计时器清0
count = 0;
//计时器等于间隔的时候循环结束
while(how > count)
{
//取余,目的是数组最后一个元素,下标 + 1 就能返回数组第一个元素
who = (who + 1) % size;
//数的是活人的话,计时器加1
if ((person[who] & 0x80) == 0)
{
count++;
}
}
//处决囚犯,把最高位变为1
person[who] |= 0x80;
//显示被处刑的囚犯的名字
printf("%d was die.\n", person[who] & 0x7f);
}
return 0;
}