約瑟夫環問題 多解

2021-10-12 03:00:11 字數 1910 閱讀 3581

這裡引入乙個之前做過的一道題目:

7-28 猴子選大王 (20分)

一群猴子要選新猴王。新猴王的選擇方法是:讓n只候選猴子圍成一圈,從某位置起順序編號為1~n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?

輸入格式:

輸入在一行中給乙個正整數n(≤1000)。

輸出格式:

在一行中輸出當選猴王的編號。

輸入樣例:

11輸出樣例:

7解法一:陣列

#include

int main()

while

(count1)

//當圈裡猴子只有乙個時不再執行**}if

(count==n-

1)break;}

}//輸出結果

for(i=

0;i<

n;i++)}

return0;

}

上面寫的**為了便於理解並未優化,如有問題請及時指正,感謝大佬。

解法二:迴圈鍊錶

下面展示一些內聯**片

// a code block

var foo = 'bar';

// an highlighted block

#include

#include

//宣告鍊錶節點

typedef struct node

node;

/*建立鍊錶節點的函式*/

node*

creatnode

(int x)

//建立環形鍊錶,存放整數1到n

node*

creatjoseph

(int n)

q->next = head;

//末尾節點指向頭結點,構成迴圈鍊錶

return head;

}//開始進行運算

void

runjoseph

(int n)

//第3個人出圈

q = p-

>next;

//q表示第三隻猴子

p->next = q-

>next;

//q指向的下乙個是第四只猴子

p = p-

>next;

//下一次從第四只猴子開始

free

(q);

//把第三隻猴子踢出鍊錶。

}//這裡的for迴圈這樣寫的原因是,位址操作。

printf

("%d"

,p->number)

;//輸出猴子之王。

}int main()

解法三:函式遞迴()

思路:推導出遞迴公式即可

-------------------後續再敲這個**吧,遞迴人腦袋大。。。

解法四:迭代**

思路:與函式遞迴相似,使用for迴圈搞出來。

下面展示一些內聯**片

// a code block

var foo = 'bar';

// an highlighted block

#include

int main()

額。。。。。。

希望有錯誤的地方大佬及時指出,我及時改過來,嘿嘿。

約瑟夫環問題多解法彙總

問題 首先,讓小朋友們圍成乙個大圈。然後,隨機指定乙個數 m,讓編號為 0 的小朋友開始報數。每次喊到 m 1 的那個小朋友要出列唱首歌,並且不再回到圈中,從他的下乙個小朋友開始,繼續 0 m 1 報數 這樣下去 直到剩下最後乙個小朋友,哪個小朋友會在最後表演呢?注 小朋友的編號是從 0 到 n 1...

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...