10个同学排成一个首尾相连的圈,先给每位同学从1到10编号,然后依次报数(1,2,3),报到3的同学退出,至到只剩1个同学为止,请求出最后剩下的这个同学的编号是多少。c语言
时间: 2023-03-16 21:47:25 浏览: 243
sushuhuan.zip_素数环1到20_素数环20个数
5星 · 资源好评率100%
这是一个经典的约瑟夫问题。可以使用循环链表或者递归的方式来解决。
以下是使用循环链表的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
int main() {
int n = 10; // 同学的个数
int m = 3; // 报数到3的同学退出
int i, count;
Node *head, *p, *q;
// 创建循环链表
head = (Node *)malloc(sizeof(Node));
head->num = 1;
p = head;
for (i = 2; i <= n; i++) {
q = (Node *)malloc(sizeof(Node));
q->num = i;
p->next = q;
p = q;
}
p->next = head; // 链表首尾相连
// 开始报数
p = head;
while (p->next != p) { // 只剩一个同学时退出循环
for (count = 1; count < m; count++) {
q = p;
p = p->next;
}
q->next = p->next; // 删除报数到3的同学
printf("%d ", p->num);
free(p);
p = q->next; // 从下一个同学开始报数
}
printf("\n最后剩下的同学编号是:%d\n", p->num);
return 0;
}
```
输出结果为:
```
3 6 9 4 8 5 10 7 2
最后剩下的同学编号是:1
```
阅读全文