有n个小朋友,按1,2,3……n编号围坐一圈。从第一个开始从1到m报数,报数m的退出;从下一个开始,继续从1开始报数,报到m的退出;如此重复,最后剩下的1个小朋友获得奖品。编程输出获奖小朋友的编号
#include<stdio.h>
#include<malloc.h>
struct boy
{
int no;
struct boy* next;
};
struct boy* set(int n)
{
int i;
struct boy* t, * head = NULL, * q;
q = head;
for (i = 0; i < n; i++)
{
t = (struct boy*)malloc(sizeof(struct boy));
t->no = i + 1;
if (head == NULL) head = t;
else q->next = t;
q = t;
}
q->next = head;
return head;
}
int last(struct boy* head, int m)
{
int i;
struct boy* t = head, * q = head;
while (q->next != t)
q = q->next;
while (t != t->next)
{
for (i = 1; i < m; i++)
{
q = t;
t = t->next;
}
q->next = head;
t = t->next;
}
return t->no;
}
int main()
{
int i, n, m;
struct boy* head;
printf("input n,m:\n");
scanf_s("%d %d", &n, &m);
head = set(n);
printf("%d\n", last(head, m));
return 0;
}
运行结果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7a902a063e81be52c57a79aee236a7a4.png)