13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。
输出提示 "出圈成员及顺序:" 格式 "%3d"
输出提示 "\n最后的成员是:" 格式 "%3d"
程序的运行示例如下:
出圈成员及顺序: 3 6 (后面以此类推,抱歉这里的输出结果保密,暂不公开,注意最后一个人是不出圈的哦)
最后的成员是: (抱歉这里的输出结果保密,暂不公开)
思路:
创建一个环形链表,给链表中的每一个节点从1~13编号,然后开始淘汰过程,对于淘汰的节点,序号置为0,淘汰完成之后,找到序号不为0的即为最后留下的。
#include<stdio.h>
#define NUM 13
typedef struct people
{
int num;
struct people* next;
} people;
int main()
{
people arr[NUM];
people*head = arr;
for (int i = 0; i < NUM; i++)
{
head->num = i + 1;
head->next = &arr[i + 1];
head = head->next;
}
arr[NUM - 1].next = arr;
int count = NUM;
int i = 1;
head = arr;
printf("出圈成员及顺序:");
while (count > 1)
{
if (head->num == 0)
{
head = head->next;
continue;
}
if (i == 3)
{
printf("%3d", head->num);
head->num = 0;
count--;
}
head = head->next;
i++;
if (i > 3)i = 1;
}
printf("\n最后的成员是:");
while (head->num == 0)
{
head = head->next;
if (head->num != 0)
{
printf("%3d", head->num);
break;
}
}
return 0;
}