一群猴子要選新猴王。新猴王的選擇方法是:
讓n只候選猴子圍成一圈,從某位置起順序編號為1~n號。
從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。
如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。
請問是原來第幾號猴子當選猴王?
整體思路:
建立頭尾相連的鍊錶,將每個猴子編號,迴圈篩選。
#include
#include
struct monkey
;struct monkey *
creathead()
;//建立頭節點
void
rank
(int n,
struct monkey *head)
;//給n個猴子標號
void
delete_node
(struct monkey *head,
struct monkey *delete_one)
;//刪除其中單個鍊錶單元,是下面函式的輔助函式。
struct monkey *
delete_
(struct monkey *head)
;//刪除所有 3 的猴
struct monkey *list;
//鍊錶的頭
intmain
(void
)/*建立頭節點*/
struct monkey *
creathead()
/*對n個猴子進行標號*/
void
rank
(int n,
struct monkey*head)}}
/*刪除鍊錶單元,輔助函式*/
void
delete_node
(struct monkey *head,
struct monkey *delete_one)
pre = now;
now = pre->next;}}
/*刪除至只剩猴王*/
struct monkey *
delete_
(struct monkey *head)
else
//判斷是否是頭節點 如果是則往前乙個單元
if(now->number ==-1
)
d++;}
return now;
}
2小時【(((φ(◎ロ◎;)φ)))?】
人家10行解決;
我啥都不想說了
純數學解決:
#include
intmain
(void
)printf
("%d\n"
, s +1)
;return0;
}
還有用陣列解決:
#define n 50
#include
intmain
(void
) i =0;
k =0;
m =0;
while
( m < n -1)
if( k ==3)
i++;if
( i == n )
} i =0;
while
( num[i]==0
)printf
("%d留下\n"
, i+1)
;return0;
}
猴群選猴王(約瑟夫問題)詳解
約瑟夫問題的題目和描述就不說了,題目鏈結有很多,我直接瞎選了乙個,自己看看就可以 點這裡,原版題目,自己試試看 洛谷的題 首先說思路,每一輪都會有1個人退出,在這裡我們會關心誰退出了,誰留下來。第一輪 第m n個人退出 第二輪 第2m n個人退出 第n 1輪 第 nm m n個人退出 此時還剩下乙個...
選猴王問題
一群猴子有50只,坐在一起選猴王,每只猴子都有乙個編號1 50。從1號猴子開始報號,報到7號則退出 下只猴子繼續從1開始報,依次迴圈,則最後的乙隻猴子為猴王。試求出這只猴子的編號。include includetypedef int elemtype typedef struct lnode lis...
需找新的美猴王 約瑟夫環 猴王問題
曰 初時,天地混沌未開,後盤古生而開之,三皇五帝治世,世界遂分四大部洲。東洲有山,曰花果山,天生一石猴,石破天驚,王於群猴。求藝,實菩提名之曰 悟空 後悟空大鬧天宮,為佛祖所困,五百載,為觀音點化,乃保唐曾取經,歷八十一難而成正果,封鬥戰勝佛,自此聞達三界,而昔日 美猴王 之名亦漸成經久之傳說 話說...