圍繞著山頂有10個洞,狐狸想要吃兔子,兔子說:「可以,但必須找到我,我就藏身於這10個洞中,你從10號洞出發,先到1號洞找,第二次隔1個洞找,第三次隔2個洞找,以後如此類推,次數不限。」但狐狸從早到晚進進出出了1000次,仍沒有找到兔子。問兔子究竟藏在哪個洞裡?
(1) 把10個洞編上序號:1,2,3,4,5,6,7,8,9,0
(2) 狐狸從0號洞出發,第1次在1號洞找;第2次隔1個洞,在3號洞找;第3次隔2個洞,在6號洞找;第4次隔3個洞,在0號洞找;第5次隔4個洞口,即在5號洞找;以此類推。
(3) 可見,其實上述問題其實是乙個等差數列求和問題(首項為1,公差為1)。將求和結果對10取餘(求和結果%10),即可得到狐狸每次進去的洞口號。
(4) 如下圖所示,仔細觀察可以發現,如果狐狸連續兩次都進入出發洞口(0號洞),表明接下來進入洞口的順序與之前的順序相同!因此遇到連續兩次都進入出發洞口的情況,即可停止尋找,因為接下來只是重複之前找過的洞口。
(1) 首項為1,公差為1的等差數列求和公式:n*(n+1)/2,n為尋找的次數
(2) 狐狸每次進入的洞口號為:(n*(n+1)/2)%10,對10取餘是因為有10個洞口
(3) 設x為尋找的次數,連續兩次進入都是出發時的洞口(0號洞),可停止尋找。設
holenum為洞口的個數,本例是10
即第x-1次:((x-1)*(x-1+1)/2)%holenum == 0
第x次:(x*(x+1)/2)%holenum == 0
一般的,x = 2*holenum。即如果洞口有10個,則需要找20次,就會在遇到連續兩次進入出發的洞口(本例是第19次和第20次)
特殊的,如果holenum是(2^k +1),則 x = holenum,(k = 0,1,2,3......)。即如果洞口有15個, 則只需找15次,就會遇到連續兩次進入出發時的洞口(第14次和第15次)
(4) 可見,該演算法的時間複雜度與洞口的個數有關,具體的時間複雜度為θ(n)
1 #include 2#define holenum 1034
void findribbit(int
hole[holenum]);56
intmain()
7; //
10個山洞
9findribbit(hole);
10return0;
11}1213
void findribbit(int
hole[holenum])
1426
28for(i = 0; i < holenum; ++i) //
輸出兔子可能躲藏的洞口
2933 }
the ribbit may be in2hole
the ribbit may be in4
hole
the ribbit may be in7
hole
the ribbit may be
in9 hole
c語言狐狸捉兔子問題
圍繞著山頂有10個洞,乙隻兔子和乙隻狐狸分別住在洞裡,狐狸總想吃掉兔子,一天,兔子對狐狸說 你想吃掉我有乙個條件,先把洞順序編號,你從最後乙個洞出發,第一次先到第乙個洞找我,第二次隔乙個洞找我,第三次隔兩個洞找我,第四次隔三個洞找我,依此規律類推,尋找次數不限,我躲在乙個洞裡不動,只要你找到我,就可...
C 狐狸找兔子問題
圍繞著山頂有10個洞,乙隻兔子和乙隻狐狸住在各自的洞裡,狐狸總想吃掉兔子,一天兔子對狐狸說,你想吃我有乙個條件,你先把洞編號1到10,你從第10洞出發,先到第1號洞找我,第二次隔乙個洞找我,第三次隔兩個洞找我,以後依次類推,次數不限,若能找到我你就可以飽餐一頓,在沒找到我之前不能停止,狐狸一想只有1...
狐狸找兔子問題 C語言
圍繞著山頂有10個洞,乙隻兔子和乙隻狐狸住在各自的洞裡,狐狸總想吃掉兔子,一天兔子對狐狸說,你想吃我有乙個條件,你先把洞編號1到10,你從第10 洞出發,先到第1號洞找我,第二次隔乙個洞找我,第三次隔兩個洞找我,以後依次類推,次數不限,若能找到我你就可以飽餐一頓,在沒找到我之前不能停止,狐 狸一想只...