【算法】约瑟夫环 C++源代码

#include<iostream>
using namespace std;
int main()
{
    int a=17,b=3,winner=0;//总人数a,数到b的倍数离开,最后的人winner
    for(int i=2;i<=a;i++)
        winner=(winner+b)%i;
    cout<<"Winner:"<<winner+1<<endl;
}

我们考虑如下过程

1     2     3     4     5     6     …..  k-1  k     k+1  …    n-1  n

第一次编号为k的哥挂掉,然后剩下n-1个人,从k+1号继续.

k+1  k+1  ….n-1 n  1     2     3     4     5     6     ,

序号全部减去k  ,   得到如下序列:

1     2     3     4     5     6…..       n-1  

也就是n-1个人的情况.

假设最后剩下的人,在第(n-1)人的序列中的编号是f(n-1),那么他在n个人的序列中,编号为(k+f(n-1))%n,也就得到了我们的递推公式:

f(n)=(k+f(n-1))%n;

f(1)=1;

http://blog.csdn.net/ice110956/article/details/12906065

原文地址:https://www.cnblogs.com/bruce27/p/4290958.html