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