/*
**********************************************************
* 解法
*
* 使用一个循环链,其中包含两个元素,一个为指向下一个人的
* 节点,一个为是否出列的标记
*
**********************************************************
*/
#include <stdio.h>
#define M 30 //假设有30个人围成一个圈
#define N 13 //出列13个
#define L 9 //第9个人出列
struct node
{
int nextp; //指向下一个节点
int in_out; //是否出列的标志
} link[M+1]; //M个人的数组,下标0未曾使用
main (void)
{
int i, j, k; //作为计数器
printf ("The circle is: + mean in; - mean out \n");
for (i = 1; i < M+1; i++)
{
link[i].nextp = i + 1; //指向下一个节点
link[i].in_out = 1; //标志为1,表示都尚未出列
}
link[30].nextp = 1; //最后一个指向第一个节点,形成一个循环链
j = 30; //从指向第一个节点的位置开始计数
for (i = 0; i < N; i++) //i:出列人数的计数器
{
for (k = 0; ;) //k:出列人的计数器
{
if (k < L)
{
j = link[j].nextp; //修改指针,继续计数
k += link[j].in_out; //遍历查找出列的人。因为已出列的标记为零,所以可循环查找
}
else
break;
}
link[j].in_out = 0; //将出列的人标记为0
}
printf ("The result is:");
for (i = 0; i < M; i++) //输出结果
{
printf (" %c ", link[i+1].in_out ? '+': '-');
}
printf ("\n");
return 0;
}
#include<stdio.h>
#define M 30 //假设有30个人围成一个圈
#define N 13 //出列13个
#define L 9 //第9个人出列
int main (void)
{
int i, j, k,num,t; //作为计数器
int circus[30];
printf ("The circle is: + mean in; - mean out \n");
for (i = 0; i < M; i++)
circus[i]=1;
k=-1;
for (i = 0; i < N; i++) //i:出列人数的计数器
{
num=0;
while(num<L)
{
k++;
num+=circus[k%M];
}
circus[k%M]=0;
}
printf ("The result is:");
for (i = 0; i < M; i++) //输出结果
{
printf (" %c ", circus[i] ? '+': '-');
}
printf ("\n");
return 0;
}
运行之后