早教吧作业答案频道 -->其他-->
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
猴子选大王问题:一堆猴子都有编号,编号是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;
}
注释写得很清楚 相信你能看懂 有问题问我
你先运行就知道了
#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#中关于“猴子选大王”算法...的网友还看了以下:
读漫画回答问题.(1)该漫画揭示的问题是.(2)这一问题在我国也越来越严峻,其自然原因是、等.(3 2020-04-13 …
一道物理的题.是说一个滑雪运动员质量为80KG从山顶滑下400米之后他的速度为180KM/h.第1 2020-04-27 …
如图所示是小悦同学的一幅写生画,在仔细观察后,请你提出两个物理问题并用所学知识解释。(1)问题1: 2020-05-16 …
关于1个天文学的问题.日食下白天观测星星和晚上观测同一位置星星的星位的问题···求懂的人回答刚看了 2020-05-22 …
●试题一 阅读下列说明、图1和图2,回答问题1、问题2和问题3。 【说明】 下面是某租车信息管理系统 2020-05-26 …
试题二(15分)阅读以下说明,回答问题1至问题3,将解答填入答题纸对应的解答栏内。【问题1】(3分, 2020-05-26 …
有4轮考核,每轮设有一问题,能正确回答者进入下一轮考核,否则,被淘汰.知选手甲能正确回答1,2,3 2020-06-17 …
五(1)班部分同学到科技馆参观,一共花了84.5元买门票,已知每张门票6.5元,还要准备45.5元 2020-06-20 …
阅读下面文字,解决下列问题(1)问题背景宇昕同学遇到这样一个问题:如图1,在正方形ABCD中,点E 2020-06-24 …
有3种丁香花,花瓣分为3瓣,4瓣和5瓣。第一问题:5朵3瓣的花共有多少个花瓣?第二问题:1朵3瓣的 2020-07-04 …