c语言选猴王链表,C语言程序设计-猴子选大王[链表应用]

2032 猴子选大王

Description

有N只猴子,从1~N进行编号。它们按照编号的顺时针方向排成一个圆圈,然后从第一只猴子开始报数。第一只猴子报的第一个数字为1,以后每只猴子报的数字都是它们前面猴子所报数字加1。如果一个猴子报的数字是M,则该猴子出列,下一个猴子重新从1开始报数,直到所有猴子都出列为止,最后一个出列的猴子胜出。你的任务是对于给定猴子数量和报数上限值M,确定出能够被选作大王的猴子的编号。

Input

第一行为一个整数N,表示测试数据的组数,接下来的N行中每行包含两个整数,第一个数是猴子的个数,第二个数是报数上限值M(M>1),两数之间由空格分隔。

Output

输出共N行,每行为对应输入行获胜猴子的编号。

Sample Input

2

8 5

5 8

Sample Output

3

1

#include

#include

/* 定义链表节点类型 */

typedef struct node

{

int data;

struct node *next;

}linklist;

int creat(int n, int m)

{

linklist *head, *p, *s, *q;

int i, total;

/* 创建循环链表,头节点也存信息 */

head = (linklist*) malloc(sizeof(linklist));

p = head;

p->data = 1;

p->next = p;

/* 初始化循环链表 */

for (i = 2; i <= n; i++)

{

s = (linklist*) malloc(sizeof(linklist));

s->data = i;

s->next = p->next;

p->next = s;

p = p->next;

}

p = head;

/* 保存节点总数 */

total = n;

q = head;

/* 只剩一个节点时停止循环 */

while (total != 1)

{

/* 报数过程,p指向要删除的节点 */

for (i = 1; i < m; i++)

{

p = p->next;

}

/* q 指向 p 节点的前驱 */

while (q->next != p)

{

q = q->next;

}

/* 删除 p 节点 */

q->next = p->next;

/* 保存被删除节点指针 */

s = p;

/* p 指向被删除节点的后继 */

p = p->next;

/* 释放被删除的节点 */

free(s);

/* 节点个数减一 */

total--;

}

//free(p);

/* 打印最后剩下的节点序号 */

int vsdata=p->data;

free(p);

return vsdata;

}

int main()

{

int n[10], m[10];

/* 读入问题条件 */

int k;

scanf("%d", &k);

for (int i=0;i

{

scanf("%d%d",&n[i],&m[i]);

}

for (int ii=0;ii

{

printf("%d\n",creat(n[ii],m[ii]));

}

return 0;

}

sicily 猴子选大王

题目描述 猴子选大王,有N只猴子,从1-N进行编号.它们按照编号的顺时针方向,排成一个圆圈,然后从第一只猴子开始报数.第一只猴子报1,以后每只猴子报的数字都是它前面猴子所报数字加1.如果一只猴子报的数 ...

POJ3750: 小孩报数问题+一道经典约瑟夫问题(猴子选大王)

又一次因为一个小错误,POJ上Wrong Answer了无数次..... 在差不多要放弃的时候,发现了这个猥琐的不能再猥琐的bug,改完了提交就AC了,简直无语.... 本题wo采用模拟方法: 1 # ...

PHP编程----猴子选大王

猴子选大王 (约瑟夫环)(c#)

猴子选大王问题: 一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1到m的顺序围坐一圈, 从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子, ...

PHP洗牌、猴子选大王两个小算法

洗牌算法 /** *洗牌算法washCard *@param $cardNum *@return array */ function washCard($cardNum) { $ca ...

猴子选大王的c#实现

你可能感兴趣的:(c语言选猴王链表)