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

介绍

  约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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 3
p->data = 3
p->data = 6
p->data = 9
p->data = 2
p->data = 7
p->data = 1
p->data = 8
p->data = 5
over--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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值