題目描述
n個人排成一圈,按順時針方向依次編號1,2,3…n。從編號為1的人開始順時針"一二"報數,報到2的人退出圈子。這樣不斷迴圈下去,圈子裡的人將不斷減少。最終一定會剩下乙個人。試問最後剩下的人的編號。
n很大,直接模擬題意不行,請找出規律。
輸入不超過1000組資料。
每組資料一行,每行乙個正整數,代表人數n。 (1 <= n < 231)
輸出每組輸入資料輸出一行, 僅包含乙個整數,代表最後剩下的人的編號。
樣例輸入 copy72
樣例輸出 copy71
找規律1,1,3,1,3,5,7,1,3,5,7,9,11,13,15…
可以看出答案是1, 1 3 , 1 3 5 7 , 1 3 5 7 9 11 13 15按2的次方一組一組出現的
規律求解:
#include
#include
#include
intmain()
//答案是1,1 3 ,1 3 5 7,1 3 5 7 9 11 13 15按2的次方一組一組出現的
}
當n沒有那麼大時,可以用約瑟夫問題的數學方法求解
約瑟夫問題遞推公式:
f(n,m)=(f(n-1,m)+m)%n
遞迴求解:
#include
intf
(int n,
int m)
intmain()
return0;
}
公式求解:
#include
intmain()
}
報數問題(約瑟夫環)
解法一 用陣列模擬 include using namespace std intmain sign 實際標號的 if sign 0 sign n 1 if i n 1 cout loop sign 0 return0 解法二 從位置考慮,舉例說 nnum 5 move 212 3453 4515 ...
約瑟夫環問題(報數問題)
先說一下什麼是約瑟夫環問題,這是百科的解釋 約瑟夫環 約瑟夫問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。思路 因為n...
報數遊戲(約瑟夫環問題)
題目描述 有n個小朋友做遊戲,他們的編號分別是1,2,3 n。他們按照編號從小到大依次順時針圍成乙個圓圈,第乙個小朋友從1開始報數,依次按照順時針方向報數 報數的值加一 每個報m的人會離開隊伍,然後下乙個小朋友會繼續從1開始報數,直到只剩下乙個小朋友為止。求最後一位小朋友的編號。input 輸入兩個...