【算法】约瑟夫环 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;