求c语言的“猴子选大王”代码

要求能在c++上运行,满意还有加分。(最好能有一些讲解)请按照这个要求给我代码:猴子选大王任务:一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺... 要求能在c++上运行,满意还有加分。
(最好能有一些讲解)
请按照这个要求给我代码:
猴子选大王
任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
输入数据:输入m,n m,n 为整数,n<m
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能
展开
 我来答
龚敏GM
2008-12-10 · 超过15用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:0
展开全部
#include"stdio.h"
#include"stdlib.h"

typedef struct lnode{
int number;//猴子序列号
struct lnode *next;
}*linklist;

void creatlist(linklist &l,int number){
int i;
linklist p;
p=(linklist)malloc(sizeof(lnode));
l=(linklist)malloc(sizeof(lnode));
p->number=1;
l->next=p;
for(i=2;i<=number;i++){
p->next=(linklist)malloc(sizeof(lnode));
p=p->next;
p->number=i;
}
p->next=l->next;
}

int choice(){
linklist l,p;
int n;/*删除序号,哪个猴子数到该序号,就将哪个猴子剔除*/
int m;/*猴子总数,共有多少猴子玩这个游戏*/
int i;/*循环控制变量*/
int j=1;
printf("请输入猴子的数目(m):");
scanf("%d",&m);
creatlist(l,m);
p=l;
printf("请输入删除序号(n):");
scanf("%d",&n);
for(i=1;i<m;i++){
while(j%n){
p=p->next;
j++;
}
p->next=p->next->next;
j++;
}
return p->next->number;
}

void main(){
printf("猴王为:%d号猴子!\n",choice());
getchar();
getchar();
}

//注意:上述程序应在c++环境中运行
wubenhua2008
2008-12-10 · TA获得超过934个赞
知道小有建树答主
回答量:455
采纳率:0%
帮助的人:494万
展开全部
#include<iostream>
#include<conio.h>
using namespace std;

#define OK 1
#define ERROR 0

class Monkey
{
private:
int MonkeyNumber;
int KingNumber;
int LeaveNumber;
int *p;
public:
Monkey();
~Monkey();
int GetNumber()
{
return MonkeyNumber;
}
int GetMonkeyKing();
void DisplayKing()
{
cout<<KingNumber<<"号"<<endl;
}
};

Monkey::Monkey()
{

cout<<"多少个猴子参加选拔赛:";
cin>>MonkeyNumber;
cout<<"报到第几个数离开:";
cin>>LeaveNumber;;
p=new int[MonkeyNumber];
for(int i=0;i<MonkeyNumber;i++)
*(p+i)=i+1; /*为每个猴子编号1-n*/
}

Monkey::~Monkey()
{
MonkeyNumber=0;
delete [] p;

}

int Monkey::GetMonkeyKing()
{
int i,k,m;
i=0;
k=0; /*记录报数的号码*/
m=0; /*记录离开的猴子数目*/
while(m<MonkeyNumber-1) /*若有n-1个猴子离开了此圈则说明圈子里只剩下一个猴子此猴子就是猴王不要再报数了*/
{
if(*(p+i)!=0) k++; /*若这只猴子没有离此圈开就报数*/
if(k==LeaveNumber) /*报的数字若是N这设置其值为0表示此猴子离开此圈*/
{
*(p+i)=0;
k=0; /*报数器从新开始*/
m++; /*离开猴子的数量加1*/
}
i++; /*从下一个猴子报数*/
if(i==MonkeyNumber) i=0; /*若达到最大编号的猴子则从编号为1(下标为0)的开始*/
}
i=0;
while(*(p+i)==0) i++; /*若为零表示此猴子已经离开不在此圈内找下一个编号*/

KingNumber = *(p+i); /*该编号对应的猴子就是猴王*/

/*
有个简单的算法就是约瑟夫环
int i,id=0;
for (i=2; i<=MonkeyNumber;i++)
id=(id+LeaveNumber)%i;

KingNumber = id+1;

只怕你难以搞懂!只好写了个复杂点但却容易懂的!
*/
return OK;
}

int main()
{
Monkey M;
M.GetMonkeyKing();
cout<<M.GetNumber()<<"只猴子参加选猴王,最后被选为猴王的是:";
M.DisplayKing();
return OK;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
高金山
2008-12-10 · TA获得超过1万个赞
知道大有可为答主
回答量:4101
采纳率:0%
帮助的人:1984万
展开全部
这是典型的约瑟夫环的问题

#include <stdio.h>
int main(void)
{
int m, n, i, s=0;
scanf("%d%d",&m,&n);
for (i=2; i<=m; i++)
s=(s+n)%i;
printf ("最后留下的是原来第%d号\n", s+1);
}

参考资料: http://baike.baidu.com/view/717633.htm

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
邹典龙
2008-12-10 · TA获得超过4173个赞
知道大有可为答主
回答量:1887
采纳率:0%
帮助的人:1380万
展开全部
main()
{
void left(int *p, int n);
int i, num[100], n;
printf("How many monkey?");
scanf("%d",&n);
for(i=0;i<n;i++)
num[i]=i+1;
left(num, n);
for(i=0;i<n;i++)
if(num[i]!=0)
printf("No.which left last is :%d",num[i]);
}

void left(int *p, int n)
{
int i=0, out=0, count=0;
while(out<n-1)
{
if(*(p+i)!=0)
count++;
if(count==3)
{
*(p+i)=0;
count=0;
out++;
}
i++;
if(i==n)
i++;
}
}
n只猴子选大王,选举办法如下:从头到尾1,2,3报数,凡报3的退出,
余下的从尾到头1,2,3报数,凡报3的退出...如此类推,当剩下两
只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?

参考资料: http://topic.csdn.net/t/20031222/17/2590913.html

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式