题目描述
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
输入
输入n和m值。
输出
输出胜利者的编号。
示例输入
5 3
示例输出
4
提示
第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
运用循环链表,指针当前指到的链结存储了下一个链结的地址,消除的也是下一个链接,再者,开始遍历链表时算一次,而m没有减掉,所以就要让m减去两次。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ysf
{
int shu;
struct ysf *next;
};
int main()
{
struct ysf *head = NULL;
struct ysf *tmp = NULL;
struct ysf *p = NULL;
int i,j,n,m,k;
scanf("%d%d",&n,&m);
for(i = 1; i<=n; i++)
{
p = (struct ysf *)malloc(sizeof(struct ysf));
if(head == NULL)
head = p;
else
tmp ->next = p;
p ->next = NULL;
p ->shu = i;
tmp = p;
}
tmp ->next = head;
if(m<=1)
printf("0\n");
p = head;
while(p -> next != p)
{
k = m - 2;
for(;k>0;k--)
p = p ->next;
p ->next = p->next ->next;
p = p->next;
}
printf("%d\n",p ->shu);
return 0;
}
运用数组
#include <stdlib.h>
#include <string.h>
int main()
{
int a[20000];
int *p = a;
int i,j,k,z,n,m;
scanf("%d%d",&n,&m);
for(i = 1;i<=n;i++)
{
a[i] = i;
}
j = n;
z = 0;
while(j > 1)
{
for(k = 0;;)
{
z++;
if(a[z] != 0)
{
k++;
}
if(k == m)
{
a[z] = 0;
j--;
}
if(z == n)
z = 0;
if(k == m)
break;
}
}
for(i = 1;i<=n;i++)
{
if(a[i] != 0)
printf("%d\n",a[i]);
}
return 0;
}