C语言经典问题-约瑟夫问题

8只猴子围坐成一个圈,

按顺时针方向从1到8编号。
然后从1号猴子开始
沿顺时针方向从1开始报数,
报到m的猴子出局,
再从刚出局猴子的下一个位置重新开始报数,
如此重复,直至剩下一个猴子,
它就是大王。
设计并编写程序,实现如下功能:
  • 给出当选猴王的编号。
  • 要求由用户输入报的数m。
#include <stdio.h>

int main(int argc, const char *argv[])
{
	int i;
	int a[100] = { 0 };
	int all_num = 8;//猴子总数
	int start_num = 2;//从几号猴子开始 下标1
	int kill_num = 4;//数到几杀死猴
	printf("请您输入猴子总数 从几开始 数到几出局:\n");
	scanf("%d%d%d",&all_num,&start_num,&kill_num);
	for(i = 0; i < all_num; i++)
		a[i] = i+1;
	//1.先确定第一个被杀死猴子的下标
	int out = (start_num+kill_num-2)%all_num;//out即将出局猴子对应的下标
	//2.循环杀猴
	while(a[1] != 0)
	{
		printf("monkey --->%d out!!\n",a[out]);
		for(i = out; i < all_num; i++)
		{
			a[i] = a[i+1];
		}
		all_num--;
		out = (out+kill_num-1)%all_num;//继续找下一个被杀猴子的下标
	}
	//3.打印猴王
	printf("monkey king is %d!!\n",a[0]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值