猴子選大王 – 約瑟夫問題( C++)

【問題描述】要從n只猴子中選出一位大王。它們決定使用下面的方法:
n只猴子圍成一圈,從1到n順序編號。從第q只猴子開始,從1到m報數,凡報到m的猴子退出競選,下一次又從退出的那隻猴子的下一隻開始從1到m報數,直至剩下的最後一隻爲大王。請問最後哪隻猴子被選爲大王。
【輸入形式】控制檯輸入三個整數n,m,q。
【輸出形式】輸出最後選爲大王的猴子編號。
【樣例輸入】
7  4  3
【樣例輸出】
4

【樣例說明】輸入整數n = 7,m = 4,n = 3,輸出4

典型的約瑟夫問題,遞推公式的思路是拿掉一隻猴子之後相當於把(n-1)只猴子按一定規律重排編號之後再開始選大王

#include <iostream>

using namespace std;

int f(int n, int m, int q)
{
if (n == 1)
return 1;

if (q > 1)
return (f(n, m, 1) + q – 2) % n + 1;
else
return (f(n – 1, m, 1) + m – 1) % n + 1;
}

int main()
{
int n, m, q;
cin>>n>>m>>q;
cout<<f(n,m,q);
return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章