猴子选大王
发布网友
发布时间:2022-04-18 20:47
我来回答
共4个回答
懂视网
时间:2022-04-19 01:08
今天来实现一个约瑟夫环算法,下面是一道新浪的面试题:
m只猴子围坐成一个圈,按顺时针方向从1到m编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到n的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。设计并编写程序,实现如下功能:
(1)要求由用户输入开始时的猴子数m、报数的最后一个数n。
(2)给出当选猴王的初始编号。
这道题是典型的约瑟夫环问题,“猴子选大王”问题。
注意:本实例在python2.7下测试通过,未在python3下测试,有兴趣的同学可以到群里交流
直接上代码:
#!/usr/bin/python
# coding=utf-8
# 约瑟夫环算法 之 猴子选王 问题
def king(m,n):
dd = {}
#生成一个字典
p = 1
while(p<=m):
dd[p] = p
p = p+1
j = 1
while(len(dd) >1):
for k,v in dd.items():
if(j == n):
del dd[k]
j = 1
else:
j = j+1
return dd
print king(6,2)
注意:这里用到了字典,而不是list。主要是因为这样可以利用字典的索引的优势
热心网友
时间:2022-04-18 22:16
有M只猴子围成一圈,每只各一个从1到M中的编号,打算从中选出一个大王;经过协商,决定出选大王的规则:从第一个开始循环报数,数到N的猴子出圈,最后剩下来的就是大王。要求:从键盘输入M、N,编程计算哪一个编号的猴子成为大王
#i nclude<iostream.h>
int choose(int num,int del)
{
int i;
int a[100];
for(i=0;i<num;i++)
a[i]=1; //猴子状态初始化,为1表示可能被选上,为0表明没希望了;
int sum=0, //循环记数;
countOne=num; //累积记数初始化,大于1表明还有大王候选人;
while(countOne>1)
{
countOne=0;
for(i=0;i<num;i++)
{
sum+=a[i];
if(sum==del)
sum=a[i]=0; //淘汰倒霉猴子;
countOne+=a[i];
}
}
for(i=0;i<num;i++)
if(a[i]!=0)
return i; //找到幸运猴子编号(从0开始的);
}
void main()
{
int num,del;
cout<<"请输入猴子总数和淘汰数:";
cin>>num>>del;
cout<<"第"<<choose(num,del)+1<<"个猴子为王!"<<endl;
}
热心网友
时间:2022-04-18 23:34
用一个循环的链表吧,模拟选择,每选出一个,就进行输出,同时删除该结点。
更方便的方法就是用一个循环bool类型数组,加一个边界条件,模拟选择,每选出一个就输出,同时将该数组元素的真值设置为假。
热心网友
时间:2022-04-19 01:09
程序参考:
#include
<stdio.h>
int
main()
{
int
n;
int
n1=0;
//表示报数记数器
int
p=0;
//指向当前数组元素的下标
int
NumOfKing;
//大王的编号
int
M,K;
//M为已知猴子总数,K为报数的量级
int
a[1000];
FILE
*fp1,*fp2;
if((fp1=fopen("monkey.in","r"))==NULL)
{
printf("cann't
open
file!\n");
return
0;
}
fscanf(fp1,"%d%d",&M,&K);
//从文件中读取已知数据
n=M;
//M为圈的长度,即初始猴子数
for(int
i=0;i<n;i++)
a[i]=1;
//初试话状态数组,所有猴子都是就位的
while(n>1)
//n当前圈内还剩下的猴子数,控制循环在圈内只剩下一只猴子时结束循环
{
while(n1<K)
//n1表示报数记数器,每报一次n1加1,直到报完k个数之后结束此循环
{
if(a[p]==1
)
//如果当前位置有猴子
{
n1++;
//报数记数器加1
if(n1==K)
a[p]=0;
//将第K次报数的猴子置0,表示退出圈子
}
p++;
//移动到下一个位置
p=p%M;
//这一步是为了解决循环数组成环遍历的目的
}
n1=0;
//当报完K个数后将报数记数变量清0,以备下次重新报数
n--;
//当报完一轮后总猴子数减1
}
for(int
i=0;i<M;i++)
//最后遍历一遍状态数组
找到状态为1的下标i+1即为猴子大王的编号
{
if(a[i]==1)
{
NumOfKing=i+1;
break;
}
}
fp2=fopen("monkey.out","w");
fprintf(fp2,"%d",NumOfKing);
fclose(fp1);
fclose(fp2);
return
0;
山中无老虎,猴子称大王下一句是什么?
应该是:“山中无老虎,猴子称大王”。意思是:老大没了之后其他小弟都可以当老大。出自:清代周希陶的《增广贤文》原文:山中无老虎,猴子称霸王。译文:老虎离开了大山之后,猴子在山里当了大王。
约瑟夫问题猴子选大王
基本要求:编写函数实现,输入参数为猴子总数m和每次数的个数n(n<m),输出大王的编号。C程序实现c#include #include struct monkey { int num; struct monkey *next;};// ... 其他函数定义 ...int main() { // ... 输入数据并计算 ... printf("猴王的编号是:%d\n", kin...
猴子选大王是哪一类的题目??快!!!
实际是Josephus(约瑟夫)问题 [问题描述]M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,从第1号开始按顺序1,2,…,N报数,凡报到N的猴子退出到圈外,如此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王。M和N由键盘输入,打印出最后剩下的那只猴子的编号。[问题分析]这个...
山中无老虎 猴子称大王什么意思
老虎大王听说了这件事,非常的生气,因为上朝的时候经常有动物请病假,其实都是去听猴子唱哆唻咪去了。猴子请的假就更多了,因为他有自己的事业,就是把哆唻咪唱遍大山的每一个角落,实在太忙了,就没有时间去参拜老虎大王。动物们奏请老虎大王将哆唻咪作为动物王国的国歌,更加激起了老虎的怒火。他...
山中无老虎的下一句是?
山上无老虎,猴子称大王是一个俗语,比喻没有贤人,普通人物也可以充当重要角色。出自《晚清文学丛钞·冷眼观》第十四回:“靠著老子做过上海道,在城里面山上无老虎,猴子称大王弄惯了的脾气,陪著朋友来吃台把酒,就像是连四块下脚钱都是冤枉花的”。传说老虎在开初就以镇山制兽之威名当上了兽王...
11只猴子选大王,最后谁是大王
为:n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。设计并编写程序,实现如下功能:(1) 要求由用户输入开始时的猴子数n、报数的最后一个数m。(...
《山中无老虎猴子称大王》十二生肖中猴子的故事
那时猴子和老虎是邻居。他们称彼此为兄弟。当虎王出去的时候,猴子们服从了振山的命令。所有的野生动物都惧怕虎王的威风,只听猴子的召唤。这就是“山中无老虎,猴子称大王”的由来。有一天,虎王不幸落入猎人的罗网。他拼命挣扎,没能逃脱。就在猴子来的时候,虎王大声呼救。猴子见状,赶紧爬上树,解开...
C数组猴子选大王
结果:--- 猴子竞选大王 --请输入猴子的总数num = 10 按顺时针方向就坐的猴子编号依次是:猴子1 猴子2 猴子3 猴子4 猴子5 猴子6 猴子7 猴子8 猴子9 猴子10 规定数字,报出这个数的猴子将被淘汰出局,这个数max_hao = 2 被淘汰出局的猴子依次是:猴子2 猴子4 ...
猴子选大王的编程,数据结构方法
不确定具体题目,从网上摘抄来的题目:山上有n只猴子要选大王,选举办法如下:所有猴子从1到n进行编号并围坐一圈,从第一号开始按顺序1,2,...m继续报数,凡是报m号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。这个题目是循环链表的应用,循环链表...
n只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照...
M只猴子要选大王,选举办法如下:所有猴子按1,2……n编号围成一圈,从第一号开始顺序1,2……m,凡是报m号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。C++解答 include <iostream> using namespace std;struct monkey //结构声明 { int num; //整型数,用于记录猴子...