約瑟夫環問題的陣列實現
約瑟夫環問題的描述為,設有編號為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
用陣列模擬實現約瑟夫環
約瑟夫問題: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值,從他在