1. 程式人生 > >約瑟夫環問題的陣列實現

約瑟夫環問題的陣列實現

約瑟夫環問題的描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出圈的次序。

  解題思路: 網上給的較多的解法是迴圈連結串列和數學推匯出公式的思想,但如果是一個剛接觸C語言沒多久的人,對迴圈連結串列的解法肯定看不懂,而數學推導的過程相信也會讓很多人特別迷惑,而用陣列求解還是比較容易理解的。

用陣列求解的基本思想就是用一個一維陣列去標識這n個人的狀態,預設全為1,也就是都在圈子內,當喊道m的人出圈之後,他的標識則變為0(就是出圈了),同時報數器清0,下一個人要從1開始。在每次報數之前要判斷他是否在圈子內(也就是他的標識是否為1),如果在圈子裡面才會繼續報數。定義一個變數記錄出圈的人數, 出圈的人數等於 n-1時,則遊戲結束。

注意:當m = 1的時候,如果沒有if(count == m  - 1) break; 的判斷,會把1到n都輸出出來。

 1 #include<stdio.h>
 2 #define N 1000000
 3 int flag[N] = {0};
 4 int main()
 5 {
 6     int n = 0, m = 0;
 7     scanf("%d%d", &n, &m);
 8     int i = 0;
 9     int count = 0;  //記錄出圈的人數
10     int num = 0;    //報數器
11     for(i = 1; i <= n; i++) {
12 flag[i] = 1; 13 } 14 while(count < n - 1) { 15 for(i = 1; i <= n; i++ ) { 16 if (1 == flag[i]) { 17 num++; 18 if(num == m) { 19 printf("%d\n", i); 20 count++; 21 flag[i] = 0
; 22 num = 0; 23 } 24 if(count == n - 1) { 25 break; 26 } 27 } 28 29 } 30 } 31 32 33 for(i = 1; i <= n; i++) { 34 if(1 == flag[i]) { 35 printf("The last one is : %d\n", i); 36 } 37 } 38 39 40 return 0; 41 }

相關推薦

陣列實現

以前貌似寫過,但早已忘了。個人覺得約瑟夫環用單鏈表的話比較好理解,節點出列直接刪掉就好,環的迴圈可以用迴圈連結串列。但陣列實現的話程式碼會少一些,所以心血來潮決定用陣列來寫。 雖然用陣列,但邏輯也好理解,被選定的數把它賦值為-1表示出列,下標越界時與陣列個數作下模運算即可。

java實現

關於此次約瑟夫環的解答,關鍵是自己動手去嘗試,本人使用的是eclipse(java)去編寫的,內容是確認過結果的,歡迎指正 1、首先說一下,約瑟夫環的問題就是類比於一圈小朋友,圍在一塊,然後丟手絹,以定點的長度進行篩選,繼而最後剩下最後一名小朋友。 2、在此次試驗中,遇到

java實現

問題: N個人從1到N編號,圍城一圈,從1開始報數, 數到X時,將X的編號輸出,並將那個人踢出, 下一個從1再開始報數,直到所有人都出去 思路: 就是計數,移除,沒有太深的思想,直接上程式碼: pa

python 實現

面試的過程中遇到了這個問題。就是經典的約瑟夫環。總共有41個人,排成一排,數到3的人自殺,問最後剩下的是那兩個號碼? 這個題目最早是用指標實現的。在我面試python的過程中遇到了,我嫌麻煩,所以只寫了虛擬碼。後來想來一下,這樣實在是表現太差勁啊。python是很方便的,為

C++實現很經典的做法

原文地址:http://www.cnblogs.com/hanxi/archive/2012/10/10/2718413.html /* **********************迴圈連結串列解決約瑟夫環問題*********************** * 問題:約瑟

單向迴圈連結串列的實現以及實現

/* * single.h * * Created on: 2012-7-21 * Author: root */ #ifndef SINGLE_H_ #define SINGLE_H_ #include<stdio.h> #includ

hdu4841---圓桌問題解題報告(問題---陣列,queue,vector三種實現方式)

                                          &

陣列模擬實現

約瑟夫問題:n個人圍成一圈,從第一個人開始報數,數到m的人出圈;再由下一個人開始報數,數到m的人出圈;…輸出依次出圈的人的編號。n,m由鍵盤輸入。 要求: 用陣列模擬實現 。 #include <iostream> #include <cstring> using

C語言用陣列1. 簡單約瑟夫環問題: N個人,編號從1~N圍成一圈,輸入一個數T,從1號開始報數,報到T的人出圈;下一人又從1開始報數,下一個報到T的人出圈,輸出出圈順序。 考慮問實現約瑟夫環問題

1. 簡單約瑟夫環問題: N個人,編號從1~N圍成一圈,輸入一個數T,從1號開始報數,報到T的人出圈;下一人又從1開始報數,下一個報到T的人出圈,輸出出圈順序。 考慮問題: 報到T的人出圈,怎麼表示出圈?要麼刪除對應的標號,其他的標號前移(如果是陣列結構,要依次移動

問題的陣列實現

約瑟夫環問題的描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出圈

C語言,陣列實現問題(兩種方法)

約瑟夫環問題:約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 第一種方法:要求將每次

簡單陣列實現演算法

問題描述:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從第一個人開始報數,數到m的那個人出桌;他的下一個人又從1開始報數,數到m的那個人又出桌;依此規律重複下去,直到圓桌周圍的人全部出桌。設計演算法求當給定任意n和m後,n個人的出桌次序。 演

用C++實現的問題

content 人在 -h tel padding next family bsp sun 約瑟夫問題是個有名的問題:N個人圍成一圈。從第一個開始報數,第M個將被殺掉,最後剩下一個,其余人都將被殺掉。比如N=6,M=5。被殺掉的人的序號為5,4,6。2。3。最後剩下1

數組簡單實現

sys 進行 記錄 約瑟夫環 人的 out () live ava 約瑟夫環是一個很有意思的算法。大意就是:羅馬人占領了喬塔帕特,41個人藏在一個山洞中躲過了這場浩劫。這41個人中,包括歷史學家約瑟夫(Josephus)和他的一個朋友。剩余的31個人為了表示不想羅馬

實現

賦值 答案 就是 必須 創意 class 復習 標記 sys 最近在看關於約瑟夫環的一些解決思路,發現了一種很有創意的解法,記錄下,用來復習。 //用於判斷某個數是否已經被剔除 boolean[] isChoosed = new boolean[n];

的c語言實現(代碼已實現

def 數字 com max std urn img pri c語言實現 # include <stdio.h> #define MAXLEN 20 int front=MAXLEN-1;//隊列初始化 int rear=MAXLEN-1; enqu

連結串列實現

寫的蠻繁瑣的,而且中間還出現了些問題 #include <iostream> #include <stdio.h> #include <cstring> using namespace std; typedef struct node { i

的c語言實現(程式碼已實現

# include <stdio.h>   #define MAXLEN 20   int front=MAXLEN-1;//佇列初始化 int rear=MAXLEN-1;   enqueue(int q[],int x) //入隊 {   rea

問題的遞迴實現

約瑟夫環問題有很多實現方法,迭代啦,遞迴啦。 這裡主要介紹一下遞迴的方法。 假設: 初始情況: 0, 1, 2 ......n-2, n-1 (共n個人)  第一個人(編號一定是(m-1)%n,設之為(k-1) ) 出列之後, 剩下的n-1個人組成了一個新的約瑟夫環(以編號為k==m%n的

-順序表實現

題目: 約瑟夫環的一種描述為 編號為1,2,…,n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。 一開始任選一個正整數作為報數上限值m,從第一個人開始按順時針方向自1開始順序報數,報到m時停止報數。 報m的人出列,將他的密碼作為新的m值,從他在