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

8只猴子围坐成一个圈,

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

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;
}

你可能感兴趣的:(c语言,算法)