早教吧作业答案频道 -->其他-->
猴子选大王n只猴子围坐成一个圈,按顺时针方向从1到n编号.然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个
题目详情
猴子选大王
n只猴子围坐成一个圈,按顺时针方向从1到n编号.然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王.设计并编写程序,实现如下功能:
(1)\x05要求由用户输入开始时的猴子数n、报数的最后一个数m.
(2)\x05给出当选猴王的初始编号.
n只猴子围坐成一个圈,按顺时针方向从1到n编号.然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王.设计并编写程序,实现如下功能:
(1)\x05要求由用户输入开始时的猴子数n、报数的最后一个数m.
(2)\x05给出当选猴王的初始编号.
▼优质解答
答案和解析
1.需求分析:
根据问题描述可知,该问题中m个猴子围坐在一起形成首尾相接的环,因此可用循环链表解决.从第n个猴子开始出列相当于从链表中删除一个结点.该程序主要有三个模块组成,建立单链表,报数利用do-while循环实现猴子的出列,最终剩下的猴子即猴王.具体步骤如下:
第一步 首先创建循环链表.
第二步 向单链表中填入猴子的编号
第二步 找第一个开始报数的猴子.
第三步 数到n让这个猴子出列.
第四步 接着开始报数,重复第三步
2.概要设计(流程图)
开始
定义结构体,变量
建立循环单链表
在循环链表填入数据
猴子数数Count++
Count= = n-1?
释放第n个猴子
指针q指向第n+1个节点q=q->next
否
q->next= =q?
是
猴王就是第q-〉data 个猴子
结束
3.详细设计:
#include
#include
struct Node
{
int data;
struct Node *next;
};
int main()
{
struct Node *head, *s, *q, *t;
int n, m, count=0, i;
printf("input the number m:");
scanf("%d",&m);
printf(" input the number n:");
scanf("%d",&n);
for(i=0; i< i++)>
{
s=(struct Node *)malloc(sizeof(struct Node));
s->data=i+1;
s->next=NULL;
if(i= =0)
{
head=s;
q=head;
}
else
{
q->next=s;
q=q->next;
}
}
q->next=head;
printf("before:");
q=head;
while(q->next!=head)
{
printf("%d ",q->data);
q=q->next;
}
printf("%d ",q->data);
q=head;
printf(" ");
do {
count++;
if(count= =n-1)
{
t=q->next;
q->next=t->next;
count=0;
printf("%d ", t->data);
free(t);
}
q=q->next;
}
while(q->next!=q);
printf(" the king is: %d ",q->data);
}
4.测试数据:
1)input the number m:20
input the number n:5
before:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
5 10 15 20 6 12 18 4 13 1 9 19 11 3 17 16 2 8 14
the king is: 7
2)input the number m:9
input the number n:11
before:1 2 3 4 5 6 7 8 9
2 5 9 7 8 4 1 3
the king is: 6
3)input the number m:10
input the number n:5
before:1 2 3 4 5 6 7 8 9 10
5 10 6 2 9 8 1 4 7
the king is: 3
根据问题描述可知,该问题中m个猴子围坐在一起形成首尾相接的环,因此可用循环链表解决.从第n个猴子开始出列相当于从链表中删除一个结点.该程序主要有三个模块组成,建立单链表,报数利用do-while循环实现猴子的出列,最终剩下的猴子即猴王.具体步骤如下:
第一步 首先创建循环链表.
第二步 向单链表中填入猴子的编号
第二步 找第一个开始报数的猴子.
第三步 数到n让这个猴子出列.
第四步 接着开始报数,重复第三步
2.概要设计(流程图)
开始
定义结构体,变量
建立循环单链表
在循环链表填入数据
猴子数数Count++
Count= = n-1?
释放第n个猴子
指针q指向第n+1个节点q=q->next
否
q->next= =q?
是
猴王就是第q-〉data 个猴子
结束
3.详细设计:
#include
#include
struct Node
{
int data;
struct Node *next;
};
int main()
{
struct Node *head, *s, *q, *t;
int n, m, count=0, i;
printf("input the number m:");
scanf("%d",&m);
printf(" input the number n:");
scanf("%d",&n);
for(i=0; i< i++)>
{
s=(struct Node *)malloc(sizeof(struct Node));
s->data=i+1;
s->next=NULL;
if(i= =0)
{
head=s;
q=head;
}
else
{
q->next=s;
q=q->next;
}
}
q->next=head;
printf("before:");
q=head;
while(q->next!=head)
{
printf("%d ",q->data);
q=q->next;
}
printf("%d ",q->data);
q=head;
printf(" ");
do {
count++;
if(count= =n-1)
{
t=q->next;
q->next=t->next;
count=0;
printf("%d ", t->data);
free(t);
}
q=q->next;
}
while(q->next!=q);
printf(" the king is: %d ",q->data);
}
4.测试数据:
1)input the number m:20
input the number n:5
before:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
5 10 15 20 6 12 18 4 13 1 9 19 11 3 17 16 2 8 14
the king is: 7
2)input the number m:9
input the number n:11
before:1 2 3 4 5 6 7 8 9
2 5 9 7 8 4 1 3
the king is: 6
3)input the number m:10
input the number n:5
before:1 2 3 4 5 6 7 8 9 10
5 10 6 2 9 8 1 4 7
the king is: 3
看了 猴子选大王n只猴子围坐成一个...的网友还看了以下:
盒子里有8张数字卡片,其中6张数字卡片为:2/3、5/9、0.5151……24/47、13/25/ 2020-05-14 …
数独九宫格利用已知线索和逻辑推理,将1-9的数字按从左至右的顺序分别填入每个空白的格子利用已知线索 2020-06-10 …
在整数数位顺序表中,从右边数起,第()位到第()位是个级,它们的计数单位在整数数位顺序表中,从右边 2020-06-14 …
把下面两组数按顺序排列(1)11.6%1又6分之11.1671.16661.1616161616. 2020-06-20 …
3.对句中加点词语的含义理解有误的一项是()A.父亲老实厚道低眉顺眼累了一辈子,没人说过他有地位, 2020-06-21 …
如图所示.有16把椅子摆成一个圆圈,依次编上从1到16的号码,现在有一人从第1号椅子顺时针前进32 2020-07-17 …
编写程序,任意输入10个整数的数列,先将整数按照从大到小的顺序进行排序,然后输入一个整数插入到数列 2020-07-23 …
一个自然数,如果从左到右顺读和从右到左逆读,都是一样的,则这个数称为“回文数一个自然数,如果从左到右 2020-11-10 …
如图1,在3×3的正方形网格图中,除最中间的格子外,其余每个格子上都有一个数.给出如下的“跳格子”游 2020-11-22 …
1,2,.按顺序从第二个数数到第六个,共数了多少个数?按顺序第M个数数到第N个数(n>m),共数了多 2020-12-05 …