约瑟夫环问题:详解
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后[1] 结果+1即为原问题的解。
#include "cstdio"
#include "iostream"
#include "cstring"
#include "algorithm"
using namespace std;
/*约瑟夫环
从结果向上推
题意:一共n个数绕成环1-n,一开始在m位置上,每次循环走k步,走到的退出
题解:f(x)=(f(x-1)+k)%n;
*/
int main()
{
int n,k,m;
while(~scanf("%d%d%d",&n,&k,&m) &&n+k+m)
{
int ans=0;
//倒着往上推
//到最后的时候 只剩下一个,那个是答案
//倒数第二个的时候 一直推到 最开始n个的时候
// 以8 5 3 为例
// i ans
// 2 (0+5)%2 =1 ;
// 3 (1+5)%3 =0 ;
// 4 (0+5)%4 =1 ;
// 5 (1+5)%5 =1 ;
// 6 (1+5)%6 =0 ;
// 7 (0+5)%7 =5 ;
//ans= (5+3)%8+1=1;
for(int i=2;i<=n-1;i++)
{
ans=(ans+k)%i;
}
ans=(ans+m)%n +1;//一开始从m开始,题目是1-n 所以要+1
printf("%d\n",ans);
}
return 0;
}