有n个学生围城一圈,顺序排号,从第1个学生开始报数,凡报到m的学生退出圈子,到最后只留下一名学生,问最后留下来的是原来第几号学生?
以下是使用C语言实现,使用链表,最后链表头尾相接
#include <stdio.h>
int main(void)
{
int m , n;
printf("请输入学生数n:");
scanf("%d", &n);
printf("请输入报数m:");
scanf("%d", &m);
struct people
{
int number;
struct people *Next;
};
struct people *head = NULL;
struct people *newPeople, *flag;
flag = NULL;
for (int i = n; i > 0; i--)//倒着创建链表,则最后指向的是学生1
{
newPeople = (struct people*)malloc(sizeof(struct people));
if (newPeople != NULL)
{
newPeople->number = i;
}
newPeople->Next = flag;
flag = newPeople;
if (i == n)
head = newPeople;//链表头指向第n个学生
}
head->Next = newPeople;//链表头尾相接
head = newPeople;//链表头指向第1个学生
int i = 1, count = 1;
while (head->Next != NULL)
{
i++;
if (i == 3)
{
flag = head->Next;
head->Next = (flag)->Next;
free(flag);//释放掉不用的链表节点
count++;//计数
i = 1;
}
if (count == n)
break;
head = head->Next;
}
printf("%d", head->number);
return 0;
}