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

第一個是整個問題解決的精髓算法也不知道這個能不能叫做算法,我還沒有正式的接觸 )。
第二個就是數組的整理。如果用鏈表來實現的話,就是節點的刪除與鏈表的重新鏈接學的不是很好,可能會有錯誤的說法,希望大佬們指正)。
希望我能早點寫出鏈表實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章