13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。 ***输出提示:"\n出圈成员及顺序:" ***输出格式:"%3d" ***输出提示:"\n最后的成员是:" ***输出格式:"%3d"
1、不用结构体
cpp
#include<stdio.h>
int main()
{
int a[13]={0};
int i,j=0,n;
printf("\n出圈成员及顺序:");
for(i=1;i<=12;i++)
{
n=1;
do
{
if(j>12) j=0;
if(a[j]!=0) j++;
else
{
if(n==3)
{
a[j]=i;
printf("%3d",j+1);
}
j++;
n++;
}
}while(n<=3);
}
printf("\n最后的成员是:");
for(i=0;i<=12;i++)
{
if(a[i]==0)
printf("%3d",i+1);
}
return 0;
}
2、用结构体(参考答案)
cpp
#include <stdio.h>
#define N 13
struct person
{
int number;
int nextp;
}link[N + 1];
int main(void)
{
int i, count, h;
/* 建立队列 */
for (i = 1; i <= N; i++)
{
if (i == N)
{
link[i].nextp = 1;
}
else
{
link[i].nextp = i + 1;
}
link[i].number = i;
}
count = 0;
h = N;
printf("\n出圈成员及顺序:");
while (count < N - 1)
{
i = 0;
while (i != 3)
{
h = link[h].nextp;
if (link[h].number)
{
i++;
}
}
printf("%3d", link[h].number);
link[h].number = 0;
count++;
}
printf("\n最后的成员是:");
for (i = 1; i <= N; i++)
{
if (link[i].number)
{
printf("%3d", link[i].number);
}
}
return 0;
}