這裡引入乙個之前做過的一道題目:
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個猶太人決定寧願死也...