早教吧 育儿知识 作业答案 考试题库 百科 知识分享

c#中关于“猴子选大王”算法的疑问?猴子选大王问题:一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1到m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下

题目详情
c#中关于“猴子选大王”算法的疑问?
猴子选大王问题:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1到m的顺序围坐一圈,
从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王
using System;
using System.Collections.Generic;
using System.Text;
namespace ExMonkey
{
class Monkey
{
public int King(int M,int N)
{
//总人数 M ,数到第 N 个排除.
int k=0;
for (int i = 2; i
▼优质解答
答案和解析
顺序表和单链表两种方法都写好了
注释写得很清楚 相信你能看懂 有问题问我
你先运行就知道了
#include
#include
#define MAXSIZE 100
typedef struct Node
{
int data;//存储猴子编号
struct Node *next;
}*List;
/* 用链表来得出大王的序号 */
int LinkedList(int num_monkey,int number);
/* 用顺序表来得出大王的序号 */
int SequenceList(int num_monkey,int number);
/* 创建循环单链表 */
List CreateList(int n);
void main()
{
int m,n,way,king;
printf("请输入猴子个数:");
scanf("%d",&n);
printf("请输入要报的数:");
scanf("%d",&m);
while (1)
{
printf("\n请选择解决问题的方法:\n");
printf("1.单链表\n");
printf("2.顺序表\n");
scanf("%d",&way);
if (way == 1)
{
king = LinkedList(n,m);
break;
}
else if (way == 2)
{
king = SequenceList(n,m);
break;
}
else
{
printf("输入不合法!\n");
}
}
printf("%d号猴子是大王\n",king);
}
/* 创建循环单链表 */
List CreateList(int n)
{
int i;
List head,p;
head = (List)malloc(sizeof(struct Node));
head->next = head;
for (i = 1; i < n; ++i)
{
p = (List)malloc(sizeof(struct Node));
p->next = head->next;
head->next = p;
}
p = head;
for (i = 0; i < n; ++i)
{
p->data = i+1;
p = p->next;
}
return head;
}
/* 用链表来得出大王的序号 */
int LinkedList(int num_monkey,int number)
{
int i,j;
List head = CreateList(num_monkey);
List tail = head;//用来存储最后一个节点的地址
List out,p;//out指向要淘汰的节点,p指向其前一个节点
/* 让tail指向最后一个节点 */
for (i = 1; i < num_monkey; i++)
{
tail = tail->next;
}
/* 淘汰的猴子个数比总个数少1,报数一轮就淘汰一个猴子,所以需要报数的轮数比
猴子总个数少1*/
for( i = 1; i < num_monkey; i++ )
{
p = tail;
/* 让p指向要淘汰的猴子的前一个 */
for ( j = 1; j < number; j++ )
{
p = p->next;
}
out = p->next;
/* 如果最后一个猴子被淘汰就更新尾节点 */
if (out == tail)
{
tail = p;
}
p->next = out->next;
printf("猴子%d淘汰\n",out->data);
free(out);//删除被淘汰猴子的节点
}
return p->data;
}
/* 用顺序表来得出大王的序号 */
int SequenceList(int num_monkey,int number)
{
/* 用来表示个猴子的信息,如果猴子出局就存储0,否则存储1.第一个元素不使用 */
int monkey[MAXSIZE];
/* 用来表示出局的猴子的序号 */
int out = 1;
/* 用来表示当前猴子的个数 */
int num_now = num_monkey;
int i,j;
for (i = 0; i < num_monkey+1; i++)
{ /* 开始将每个元素置1 */
monkey[i] = 1;
}
/* 报数次数比猴子个数少一 */
for (i = 1; i < num_monkey; i++)
{
out = 1;
/* 报数整个过程 */
for (j = 0; j < number; j++)
{
/* 如果序号数大于猴子个数,表示循环了一圈,那么去掉那个圈数 */
if (out > num_monkey)
out -= num_monkey;
/* 之前已经出局的猴子不参加报数 */
while(monkey[out] == 0)
{
out ++;
/* 如果序号数大于猴子个数,表示循环了一圈,那么去掉那个圈数 */
if (out > num_monkey)
out -= num_monkey;
}
out++;
}
out--;//报完数后out应该是被淘汰的猴子的下一个,所以要向前移动
monkey[out] = 0;
printf("猴子%d淘汰\n",out);
}
while(monkey[out] == 0)
{
out ++;
/* 如果序号数大于猴子个数,表示循环了一圈,那么去掉那个圈数 */
if (out > num_monkey)
out -= num_monkey;
}
return out;
}
看了 c#中关于“猴子选大王”算法...的网友还看了以下:

阅读下面文字,完成下列各题。一个小说家只有依赖于个人经验,才能在写作过程中找到一种确切的感觉。可靠  2020-05-12 …

英语翻译Abadbeginningmakesabadending.这就话的意思就是,如果没有一个好  2020-05-21 …

每个成功者都有一个开始,勇于开始,才能找到成功的路.用这句话写作文,那句话,我总记得.450字  2020-06-05 …

在我们这样一个有13亿多人口的大国,保障粮食安全始终是国计民生的头等大事。要研究和完善粮食安全政策  2020-06-24 …

民事诉讼法关于“期间”的问题?期间届满的日期,就是最后一个月相当于开始月份的那一天;没有开始月份的  2020-07-23 …

提取下面一段话的主要信息,写出四个关键词语。(4分)徽班这一名称早在明代中叶就开始流传于世,这与中  2020-07-26 …

谁会这道题:秦始皇开创了中国历史秦始皇开创了中国历史上第一个大一统的封建王朝.下列措施中属于秦始皇  2020-07-28 …

一切伟大的行动和思想,都有一个微不足道的开始.这句话英语原句怎么说?智者宁可防病于未然,不可治病于已  2020-11-03 …

讨论一下:成吉思汗功大于过还是过大于功?这个问题开始的时候觉得是当别人把铁木真的老婆抢走的时候,他的  2020-11-10 …

中国长城始建于什么时候最近看了一部探索频道关于中国的记录片,不知是翻译有误还是怎的,里面提到长城始建  2020-11-30 …