c语言数组实现约瑟夫循环

c语言数组实现约瑟夫循环

其实,今天写这个关于c语言数组实现约瑟夫循环是因为前两天我们《数据结构》上机课的一道练习题就是这个。但是呢,练习题上的要求是用单链表实现(这就尴尬了 )。 上课我是能听得懂的,但是估计是由于平时很少亲自动手写链表,结果这次上机,我感觉我就和个憨批样的,一脸蒙蔽(*留下了无知的眼泪 * ) 。后来呢,也就试着用别的方法解决一下。最后想起了c语言(我貌似也就只会这个qwq )。
(等我哪天学会了我在用链表写一次再发一篇)。


#include <stdio.h>
#include<windows.h>
#define N 100
int main()
{
	int n, m, s;
	printf("n表示总的玩家数\n");
	printf("m表示报该数出列\n");
	printf("s表示从第几个人开始报数\n");
	printf("请分别输入nms的值\n");
	scanf_s("%d%d%d", &n, &m, &s);
	//第一行表示总的旅客数,输入的第二行表示报数值,输入的第三行表示报数人的起始编号。
	int a[N] = { 0 };//数组初始化
	int i, j;
	for (i = 0; i < n; i++)//数组遍历 
	{
		a[i] = i + 1;//a[0]=1,.....
	}
	i = s - 1;//数组起点,因为数组下标=人物编号-1 。
	int x = 0;
	while (n > 1)//最后一个人是游戏结束。
	{
		i = (i + m - 1) % n;
		// 这里是一个简单的算法,同时也是我个人认为整个程序达到目的的核心。
		printf("第%d个出局的人是%d号\n",++x,a[i]);
		for (j = i + 1; j < n; j++)
		//因为有人出列,所以它所对应的数组下标就没有了,所以需要把再出列之后所有人的数组下标提前一位。
		{
			a[j - 1] = a[j];
		}
		n--;
		//新数组生成后,参与游戏的人数-1,即所有的元素总数-1
		if (i == n)//终点后,开始起点
		{
			i = 0;
		}
	}
	printf("最后出列的人是%d\n", a[i]);
system("pause");
	return 0;
	
}

绝大多数我还是标了一些注释的,可能会有错别字。233
这个代码整体还是我借鉴了一些前辈的。其中个人觉得比较关键的是

i = (i + m - 1) % n;
// 这里是一个简单的算法,同时也是我个人认为整个程序达到目的的核心。
for (j = i + 1; j < n; j++)
//因为有人出列,所以它所对应的数组下标就没有了,所以需要把再出列之后所有人的数组下标提前一位。
		{
			a[j - 1] = a[j];
		}

第一个是整个问题解决的精髓算法也不知道这个能不能叫做算法,我还没有正式的接触 )。
第二个就是数组的整理。如果用链表来实现的话,就是节点的删除与链表的重新链接学的不是很好,可能会有错误的说法,希望大佬们指正)。
希望我能早点写出链表实现。

发布了13 篇原创文章 · 获赞 13 · 访问量 759

猜你喜欢

转载自blog.csdn.net/jiewaikexue/article/details/101923282
今日推荐