約瑟夫問題(1,2,1,2報數)

2021-10-07 05:11:15 字數 861 閱讀 5887

題目描述

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 輸入兩個...