13个人围成一圈,从第一个人开始顺序报号1、2、3,凡是报到“3”的人退出圈子,找出最后留在圈子里的人原来的序号,用c语言的指针方法来写
时间: 2023-11-23 22:15:45 浏览: 41
这是经典的约瑟夫问题,可以使用链表或者数组模拟,这里演示使用数组的方法。
```c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 13; // 总人数
int m = 3; // 报到3的人出圈
int i, j, k;
int *a = (int *)malloc(n * sizeof(int)); // 动态分配数组空间
for (i = 0; i < n; i++)
{
a[i] = i + 1; // 初始化数组
}
i = 0; // i 表示当前报数的人在数组中的下标
j = 0; // j 表示已经出圈的人数
while (j < n - 1)
{
k = 0;
while (k < m)
{
if (a[i] != 0) // 如果这个人还在圈子里
{
k++;
}
if (k == m) // 如果报到3了
{
printf("%d 出圈\n", a[i]);
a[i] = 0; // 标记为已出圈
j++;
}
i++;
if (i == n) // 如果已经报完一圈了,从头开始
{
i = 0;
}
}
}
for (i = 0; i < n; i++) // 找出最后留在圈子里的人
{
if (a[i] != 0)
{
printf("最后留在圈子里的人是原来的第 %d 个人\n", a[i]);
break;
}
}
free(a); // 释放数组空间
return 0;
}
```