用C++实现只猴子选大王,选举办法如下:从头到尾 1,2,3报数,凡报3的退出,余下的从下一个开始循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C++实现只猴子选大王,选举办法如下:从头到尾 1,2,3报数,凡报3的退出,余下的从下一个开始循环相关的知识,希望对你有一定的参考价值。

n只猴子选大王,选举办法如下:从头到尾 1,2,3报数,凡报3的退出,余下的从下一个开始循环报数,1,2,3报数,凡报3的退出...如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?

#include "stdafx.h"
#include <iostream.h>
class Monkey

public:
Monkey * left;
Monkey * right;
int id;
Monkey::Monkey(int _id)

id = _id;

;
class MonkeyRing

public:
int monketNumAll;
int monketNum;
int ringNumberOff;
Monkey * head;
void ExitThree(Monkey * nodeNum_1) //传入报数是1的猴子

if (monketNum<3)

cout<<nodeNum_1->id<<"号猴子是猴王"<<endl;

else

Monkey * exitNodeNext = nodeNum_1->right->right;
RingDel(exitNodeNext);
monketNum--;
ExitThree(exitNodeNext->right);


Monkey * MonkeyRing::RingAdd(Monkey * left,Monkey * right,int _id) //往圈里面加猴子

Monkey * node = new Monkey(_id);
node->left = left;
node->right = right;
if (left!=NULL)

left->right = node;

if (right!=NULL)

right->left = node;

return node;

void MonkeyRing::RingDel(Monkey * node) //猴子从圈脸面退出

node->left->right = node->right;
node->right->left = node->left;
cout<<node->id<<"号猴子退出"<<endl;

MonkeyRing::MonkeyRing(int _monketNumAll)

monketNumAll = _monketNumAll;
monketNum = _monketNumAll;
ringNumberOff = 1;
head = RingAdd(NULL,NULL,1);
Monkey * left = head;
for (int i=2;i<=monketNumAll;i++)

left = RingAdd(left,NULL,i);//右手为空时因为这时还不知道下一个是谁

//让第一个猴子和最后一个猴子牵手
head->left = left;
left->right = head;

;
int main(int argc, char* argv[])
MonkeyRing * ring = new MonkeyRing(200);
ring->ExitThree(ring->head);
return 0;
参考技术A 约瑟夫环问题,上网先找资料自己试着写写看

7-28 猴子选大王(20 分)

7-28

7-28 猴子选大王(20 分)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

AC代码

#include<stdio.h>
int main(){//用对列应该好做,那么现在不会队列,怎么办呢? 
    int hou[1000];
    int num;
    scanf("%d",&num);
    for(int i=1;i<=num;i++){
        hou[i]=1;
    }
    int baoshu=0;
    int chuju=0;
    int i=1;
    while(i){
        if(hou[i]==1) 
        baoshu++;
        if(baoshu==3){
            hou[i]=0;
            baoshu=0;
            chuju++;
            if(chuju==num){
                printf("%d",i);
                break;
            }
        }
        i++;
        if(i==num+1)
        i=1;
    }
    return 0;
}

以上是关于用C++实现只猴子选大王,选举办法如下:从头到尾 1,2,3报数,凡报3的退出,余下的从下一个开始循环的主要内容,如果未能解决你的问题,请参考以下文章

java实现猴子选大王问题(约瑟夫问题)

课设1---猴子选大王(c)

猴子选大王-程序

7-28 猴子选大王(20 分)

个人第一篇博客,就先来个猴子选大王把!!!

第4章-17.猴子选大王 (20分)