#74 约瑟夫游戏

这篇博客介绍了约瑟夫游戏的算法问题,包括输入参数解析、游戏流程及错误处理。提供了一段C语言代码实现,用于在一组人数中按特定间隔删除元素,直至剩余指定人数。文章强调了对码图题目准备的重要性,并提醒读者关注即将到来的期末机考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

约瑟夫游戏的主要问题:
输入:总人数 N 
     剩余人数 K
     间隔人数 M
其中的间隔人数为实际间隔的人数,如果剩余人数为0,则输出0。
比如,输入8 4 3(空格分隔输入)
     输出1,3,6,7(逗号分隔输出)
输入数据错误时,输出ERROR
分析过程如下:
1、初始状态  1 2 3 4 5 6 7 8
2、间隔三个删除, 4,8
3、余下人数大于4,流程继续删除 5,2
4、现在剩下人数4人=K,剩余输出余下的人有:1,3,6,7

参考代码:

#include<stdio.h>
int a[100001],n,k,m,pos,num,p;
int read(int *x)
{
	char c;
	c=getchar();
	while(c!=' '&&c!='\n')
	{
		if(c<'0'||c>'9')
		{
			printf("ERROR\n");
			return 1;
		}
		*x=*x*10+c-'0';
		c=getchar();
	}
	return 0;
}
int main()
{
	if(read(&n)) return 0;
	if(read(&k)) return 0; 
	if(read(&m)) return 0;
	if(k==0)
	{
		printf("0\n");
		return 0;
	}
	if(k>n)
	{
		printf("ERROR\n");
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]==0) pos++;
		if(pos==m+1)
		{
			a[i]=1;
			pos=0;
			num++;
		}
		if(num+k==n) break;
		if(i==n) i=0;
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]==0)
		{
			if(p==0)
			{
				printf("%d",i);
				p=1;
			}
			else printf(",%d",i);
		}
	}
	return 0;
}

讲解:

        做这一道题时又一次被码图恶心到了。

        期末机考要来了,听说考的是码图的题,小伙伴们赶紧刷码图吧!

求实求真,大气大为。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fish_in_UESTC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值