猴子选王)约瑟夫环方法4种方法之一——循环数组法

题目

 话在代码里

#include <stdio.h>
int main()
{
	int n, m, number, count = 1;//猴子个数,淘汰次序,当前猴子个数,验证淘汰次序所建立的参数
	
	int i, pos;//循环用,和数组下标用。
	
	while (1)
	{	
		printf("\n请输入猴子个数,和淘汰次序\n");
		scanf_s("%d %d", &n, &m);
		if (n == 0 || m == 0)

		{
			return 0;
		}
		//初始化
		number = n;
		count = 1;
		pos = 0;
		int monkey[301]={0};
		
		for (i = 0; i <n; i++)
		{
			monkey[i] = i + 1;
		}
		//开始判断。 
				while (number > 1)//代表剩余猴子只能有一个 
		{
			if (monkey[pos] > 0)//已经被初始化(淘汰标记)为0的 
			{
				if (count == m)//到淘汰次序 
				{
					number--;
					monkey[pos] = 0;
					pos = (pos + 1) % n;//如果大于pos就重新来
					count = 1;//相当于重置循环。 
				}
				else
				{
					count++;

					pos = (pos + 1) % n;//让数组成环。 
				}
			}
			else
			{
				pos = (pos + 1) % n;
			}
		}
		for (i = 0; i < n; i++)//输出 
		{
			if (monkey[i] > 0)
			{
				printf(" %d\n", monkey[i]);
			}
		}
	}
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
猴子选大王是一个经典的问题,可以使用 C 语言中的数组来解决。 假设有 n 只猴子,我们可以用一个长度为 n 的数组来表示它们的编号,如下所示: ```c int monkeys[n]; ``` 接着,我们可以使用一个循环来初始化数组,将每只猴子的编号赋值给对应的数组元素: ```c for (int i = 0; i < n; i++) { monkeys[i] = i + 1; } ``` 这样,数组中的每个元素就表示一只猴子的编号。 接下来,我们可以使用一个 while 循环来模拟猴子选大王的过程。具体地,我们可以使用两个变量 current 和 next 分别表示当前选手和下一个选手的索引,然后在循环中不断更新它们的值,直到只剩下一只猴子为止。具体代码如下: ```c int current = 0, next = 1; while (n > 1) { // 当前选手选中下一个选手 current = (current + m - 1) % n; // 计算出下一个选手的索引 next = (current + 1) % n; // 将下一个选手的编号移到当前选手的位置上 monkeys[current] = monkeys[next]; // 将数组缩小一个元素 n--; } ``` 在这段代码中,变量 m 表示选手之间的间隔(即每次数到第 m 只猴子时,该猴子出局),而变量 n 则表示当前还剩下的猴子数。 最后,当循环结束时,数组中仅剩下一个元素,即为猴子选大王的编号。完整的代码如下: ```c #include <stdio.h> int main() { int n, m; printf("请输入猴子的数量和选手之间的间隔:"); scanf("%d%d", &n, &m); int monkeys[n]; for (int i = 0; i < n; i++) { monkeys[i] = i + 1; } int current = 0, next = 1; while (n > 1) { current = (current + m - 1) % n; next = (current + 1) % n; monkeys[current] = monkeys[next]; n--; } printf("猴子选大王的编号是:%d\n", monkeys[0]); return 0; } ``` 注意,在实际编写代码时,需要注意数组下标的范围,以及数组长度为 0 的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值