【课外作业】约瑟夫出圈问题

经典的约瑟夫出圈问题,具体的就不多说了,由于是用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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值