(1):问题提出
设由n个人站成一个圈,分别编号1,2,3,4….n。从第一个人开始报数每次报数为m的人被从圈中推出,其后的人再次从1开始报数,重复上述过程, 直至所有人都从圈中退出。要求程序由用户输入整数m和n,求这n个人从圈中推出的先后顺序。
(2):解决思路
可利用链表求解这个问题,先由n形成一个有n个表元组成的环,其中n个表元依次置值1~n。然后,从环的第一个表元出发,连续掠过m-1个表元,第m-1个表元的后继表元是第m个表元,将该表元从环中退出。接着再次从下一个表元出发,重复以上过程,直至环中表元都退出为止。
(三):代码实现
#include <stdio.h>
#include <stdlib.h>
struct LinkedList{
int number;
struct LinkedList *next;
};
void print(struct LinkedList *ll){
struct LinkedList *current = ll;
do{
printf("%d\t",current->number);
current = current->next;
}
while(current != ll);
printf("\n");
}
int main()
{
int m,n;
int i;
printf("Please input the m and n(dividded by ','):\n");
scanf("%d,%d",&n,&m);
struct LinkedList *pre = (struct LinkedList *)malloc(sizeof(struct LinkedList));
struct LinkedList *current = pre;
current->number = 1;
for(i = 2;i <= n;i++){
current->next = (struct LinkedList *)malloc(sizeof(struct LinkedList));
current = current->next;
current->number = i;
}
current->next = pre;
pre = current;
while(n){
for(i = 1; i < m;i++)
pre = pre->next;
current = pre->next;
printf("%d\t",current->number);
pre->next = current->next;
free(current);
n--;
}
return 0;
}
(四):相关知识
下面是我定义的一个关于循环链表的代码,大家可以看一下:
#include <stdio.h>
#include <stdlib.h>
#define OUT 0
#define SUCCESS 1
struct LinkedList{
int number;
struct LinkedList *next;
};
struct LinkedList * initLL(struct LinkedList *ll){
ll = (struct LinkedList *)malloc(sizeof(struct LinkedList));
ll->next = ll;
return ll;
}
int isEmpty(struct LinkedList *ll){
return ll->next == ll ? 1 : 0;
}
int size(struct LinkedList *ll){
struct LinkedList *current = ll;
int count = 0;
while(current->next != ll){
current = current->next;
count++;
}
return count;
}
void add(struct LinkedList *ll,int data){
struct LinkedList *temp = ll;
while(temp->next != ll)
temp = temp->next;
struct LinkedList *llAdd = (struct LinkedList *)malloc(sizeof(struct LinkedList));
llAdd->number = data;
temp->next = llAdd;
llAdd->next = ll;
}
int insert(struct LinkedList *ll,int position,int data){
if(size(ll) < position)
return OUT;
int i = 0;
struct LinkedList *temp = ll;
for(i = 0;i < position;i++){
temp = temp->next;
}
struct LinkedList *llAdd = (struct LinkedList *)malloc(sizeof(struct LinkedList));
llAdd->number = data;
llAdd->next = temp->next;
temp->next = llAdd;
return SUCCESS;
}
int removeAt(struct LinkedList *ll,int position){
if(size(ll) < position)
return OUT;
struct LinkedList *current = ll;
struct LinkedList *pre ;
int i = 0;
for(i = 0;i < position;i++){
pre = current;
current = current->next;
}
printf("%d\t",current->number);
pre->next = current->next;
free(current);
return SUCCESS;
}
void print(struct LinkedList *ll){
struct LinkedList *current = ll->next;
while(current != ll){
printf("%d\t",current->number);
current = current->next;
}
printf("\n");
}
(五):运行结果
下面是程序的运行结果:
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
1模拟轮盘抽奖游戏2模拟报数游戏(约瑟夫环问题)用python实现
035 报数游戏 C语言
报数游戏:a,b,c,d,e,f,g,h8人站成一排,如图所示报数,任意输入一个正整数,谁报到该数? A B C D E F G H 1 2 3 4 5 6 7 8 15 14 13 12 11 10 9 16 17 18 19 20 21 22 29 28 27 26 25 24 23 30 31 32 33 34 35 ...
基于Python的报数游戏.py
这是一个小小的C++算法题。...有n个人围在一起,然后让每个人报数1、2、3直道最后一个每次报数之后让报到“3”的人踢出队伍然后剩下的人重复这个过程。直到人数不足结束。求出最后一个人的初始编号
玩家电脑轮流报数,一次最多报数1-2个,先到30的人胜利
华为编程大赛 报数游戏 c++个人代码.pdf
华为编程大赛 报数游戏 c++个人代码.docx
华为编程大赛报数游戏c++个人代码.pdf
CSP题目-报数:甲乙丙丁决定玩一个报数的游戏来打发时间。游戏规则为四个人从1开始轮流进行报数, 但如果需要报出的数是7的倍数或含有数字7则直接跳过。此外大家约定, 在总共报出了n个数后(不计入被跳过的数)...
(C卷,100分)- 报数游戏(Java & JS & Python).html
【免费题库】华为OD题库C卷 - 报数游戏(Java 代码+解析).html
【免费题库】华为OD机试 - 报数游戏(Java & JS & Python & C & C++).html付费专栏内容,免费下载,多种语言解法
编程序,使用数组来存放各数据(人员编号),从1号人员开始数起(沿顺时针方向),当数到 k 时(其中 k>1,由用户通 过 cin 输入指定),则该号人员被“淘汰出局”;接着仍沿顺时针方向从被淘汰出局者的下一人员又 ...
有10个小孩围成一圈并依次编号,教师指定从第2个小孩开始报数,报到第3个小孩即令其出列。然后从下一个孩子继续报数,数到第3个小孩又令其出列,如此直到所有的孩子都出列。求小孩出列的先后顺序。
用队列求解:100个人围成一圈,从第一个人开始报数,报3的被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。
这个也算是老题目了,园子里边也曾针对此题有过激烈的讨论,那时候追求用oo来解决。如今既然又有人提了出来,我便抽了点时间写了写自己的想法: 代码如下: [removed] var a_game = function(pNum){ var players = [];...
1\【报数游戏】 公司总人数22人,将员工分成2队;每队设队长1人(相当于CEO) 游戏规则:人员队列、技巧由队长自行决定(时限2分钟),报数方法从第一个往后面按顺序 报数,报满4圈,即:每人需报4个数字。 示例:1...
自动发声报数器之短数版 乐天堂游戏公司推出了一款具有语音报分功能的新款游戏机。该游戏机在游戏结束后报告玩家获得的分数。你正好是开发小组中一员,并且负责对给定的分数得出它的中文读音这个模块的任务。 也...