【100题】约瑟夫环问题。。

来源:互联网 发布:淘宝开店及投资 编辑:程序博客网 时间:2024/05/01 01:07
//约瑟夫环问题#include <iostream>#include <list>using namespace std;int bxy1(unsigned int n,unsigned int m){if(n<1 || m<1){return -1;}//初始化约瑟夫环list<int> integers;for(unsigned int i = 0; i < n; ++i){integers.push_back(i);}list<int>::iterator curInteger = integers.begin();while(integers.size() > 1){//往后数m个位置。如果到达list末尾,从头接着数。for(int i=1;i < m; ++i){curInteger++;if(curInteger == integers.end()){curInteger = integers.begin();}}//删掉第m个位置上的元素//把第m+1个位置上的元素保存起来list<int>::iterator nextInteger = ++curInteger;//如果m+1个位置上的元素是end,则从begin开始。if(nextInteger == integers.end()){nextInteger = integers.begin();}--curInteger;integers.erase(curInteger);curInteger = nextInteger;}return (*curInteger);}//递推公式。。int bxy2(int n,unsigned int m){if(n<=0 || m<0){return -1;}int lastInteger = 0;for(int i=2; i<=n; ++i){lastInteger = (lastInteger + m) % i ;}return lastInteger;}void main(){cout << bxy1(3,3)<<endl;cout << bxy2(3,3)<<endl;}