猴子选大王

问题描述:n 只猴子要选大王,选举办法如下:所有猴子按1,2……n 编号围成一圈,从第一号开始顺序 1,2……m, 凡是报 m 号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。

思路:属于约瑟夫环问题,利用单向循环链表模拟此过程,输出选出的大王编号。

#include<iostream>
#include<windows.h>
using namespace std;
const int n = 18, m = 4;
typedef struct monkey{
    int num;
    struct monkey *next;
};
void main(){
    system("mode con:cols=100 lines=100");
    monkey *p, *head, *q;
    int i;
    head  = q = new monkey;
    q->num = 1;
    for (i = 2; i <= n; ++i){
        p = new monkey;
        q->next = p;
        p->num = i;
        q=p;
    }
    q->next = head;
    p = head;
    i = 0;
    while (1){
        ++i;
        cout << p->num << "号猴子报:" <<i<<endl;
        if (p->next == p) break;
        if (i == m){
            i = 0;
            cout << p->num << "号猴子被淘汰" << "-------" << p->num << endl;
            q->next = p->next;
            p = q->next;
        }
        else{
            if (i == m - 1) q = p;
            p = p->next;
        }
    }
    cout << p->num << "号猴子为大王!";
    cin.get();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值