13个人围成一圈,从第一个人开始顺序报号。凡报道3者退出圈子。找到最后留在圈子中的人原来的的序号。
#include <stdio.h>
#include <stdlib.h>
#define N 13
struct person
{
int number;
int next;
}stu[N + 1];
int main() {
//赋值
int i;
for (i = 1; i <= N; ++i)
{
if (i == N)
stu[i].next = 1; //在数字13的邻近点为1,可以形成一个循环
else
stu[i].next = i + 1; //在数字i的邻近点为i+1,依次进行赋值的操作。
stu[i].number = i; //number 即为该数字
}
//进行报道,数到三的人退出圈子
int j = N;
i = 0;
int count = 0;//i 进行清0操作
while (count<N - 1) //注意,此处循环应该是出圈的人数应该小于总的人数。否则的就停止出圈、循环报数
{
while (i<3)
{
j = stu[j].next; //必须写在if(i==3)的前面
if (stu[j].number)
{
i++; //如果这个数字没有出圈的话 将其计入在其中
}
//如果j这个数字出圈的话,就查看他的邻位数字
}
if (i == 3)
{
printf("此次出圈的数字是:%d\n", stu[j].number);//出圈
stu[j].number = 0; // 将该数字为0,代表出圈
count++; //count++,计数出圈的总人数
i = 0;//i进行归0。再次进行循环的出圈的操作
}
}
printf("最后出圈的数字为: "); //输出最后一个数。
for (i = 1; i <= N; i++)//循环遍历
{
if (stu[i].number)// 如果stu[i].number 存在的话,即为最后一个数字
printf("%d", stu[i].number);//输出
}
printf("\n");
return 0;
}