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

来源:互联网 发布:压缩感知重构算法最新 编辑:程序博客网 时间:2024/06/05 10:24

介绍

  约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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;}
0 0
原创粉丝点击