约瑟夫圆环的三种解决方案

2017-01-13 11:34:10来源:CSDN作者:Notzuonotdied人点击

介绍

约瑟夫环（约瑟夫问题）是一个数学的应用问题：已知n个人（以编号1，2，3…n分别表示）围坐在一张圆桌周围。从编号为k的人开始报数，数到m的那个人出列；他的下一个人又从1开始报数，数到m的那个人又出列；依此规律重复下去，直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1，最后[1] 结果+1即为原问题的解。

第一种

``# include <iostream>using namespace std;struct Node{    int data;    Node *next;};class CircleCount {public:    CircleCount(){}    CircleCount(int n, int m) ;    StartGame();private:    Node* first;    int m;};CircleCount::CircleCount(int n, int _m) {    m = _m;    Node* pre ,*p;    first = new Node;    first->data = 1;    pre = first;    for (int i = 2;i <= n; i++) {        p = new Node;        p->data = i;        pre->next = p;        pre = p;    }    pre->next = first;}CircleCount::StartGame() {    Node *pre, *p, *s;    pre = first;    p = pre->next;    int count = 2;    while (pre != p->next) {         if (count == m) {            cout<<"p->data = "<<p->data<<endl;            pre->next = p->next;            delete p;            //pre = pre->next;            p = pre->next;            count = 1;        }         count++;        pre = p;        p = p->next;    }    cout<<"over--p->data = "<<p->data<<endl;    delete p;}int main() {    cout<<"input the n(number) and the m(password):";    int n,m;    cin>>n>>m;    CircleCount c(n, m);    c.StartGame();    return 0;}/*input the n(number) and the m(password):10 3p->data = 3p->data = 6p->data = 9p->data = 2p->data = 7p->data = 1p->data = 8p->data = 5over--p->data = 4请按任意键继续. . .*/``

第二种

``# include <iostream>using namespace std;struct Node{    int data;    Node *next;};class CircleCount {public:    CircleCount(){}    CircleCount(int n, int m) ;    StartGame();private:    Node* first;    int m;    Node* rear;};CircleCount::CircleCount(int n, int _m) {    m = _m;    Node* pre ,*p;    first = new Node;    first->data = 1;    pre = first;    for (int i = 2;i <= n; i++) {        p = new Node;        p->data = i;        pre->next = p;        pre = p;    }    rear = pre;    pre->next = first;}CircleCount::StartGame() {    Node *pre, *p, *s;    pre = rear;    p = pre->next;    int count = 1;    while (pre != p->next) {         if (count == m) {            cout<<"p->data = "<<p->data<<endl;            pre->next = p->next;            delete p;            //pre = pre->next;            p = pre->next;            count = 1;        }         count++;        pre = p;        p = pre->next;    }    cout<<"over--p->data = "<<p->data<<endl;    delete p;}int main() {    cout<<"input the n(number) and the m(password):";    int n,m;    cin>>n>>m;    CircleCount c(n, m);    c.StartGame();    return 0;}``

第三种

``# include <iostream># include <ctime># include <cstdlib>using namespace std;struct Node{    int data;    Node *next;};class CircleCount {public:    CircleCount(){}    CircleCount(int n, int m) ;    StartGame();private:    Node* first;    int m;    Node* rear;};CircleCount::CircleCount(int n, int _m) {    m = _m;    Node* pre ,*p;    first = new Node;    srand(time(NULL));    first->data = rand()%n;;    pre = first;    for (int i = 2;i <= n; i++) {        p = new Node;        p->data = rand()%n;// 随机数        pre->next = p;        pre = p;    }    rear = pre;    pre->next = first;}CircleCount::StartGame() {    Node *pre, *p, *s;    pre = rear;    p = pre->next;    int count = 1;    while (pre != p->next) {         if (count == p->data) {            cout<<"p->data = "<<p->data<<endl;            pre->next = p->next;            delete p;            //pre = pre->next;            p = pre->next;            count = 1;        }        count++;        pre = p;        p = pre->next;    }    cout<<"over--p->data = "<<p->data<<endl;    delete p;}int main() {    cout<<"input the n(number) and the m(password):";    int n,m;    cin>>n>>m;    CircleCount c(n, m);    c.StartGame();    return 0;}``