居住在香港哪国人最多:用C编程围圈报数的题

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/29 11:17:24
13个人围成一圈,从第一个人开始顺序报号1、2、3。凡报到3者退出圈子。找出最后留在圈子里的人原来的序号。

请写清您考虑的过程和您编的程序!
谢谢

void left(int *p,int n)
{
int i,out,count;
i=out=count=0;
while (out<n-1)
{
if(*(p+i)!=0)
++count;
if(count==3)
{
*(p+i)=0;
count=0;
out++;
}
i++;
if(i==n) i=0;
}
}
#include <stdio.h>
void main()
{
int *num,n,i;
printf("How many people?\n");
scanf("%d",&n);
for(i=0;i<n;i++)
num[i]=i+1;
left(num,n);
for(i=0;i<n;i++)
if(num[i]!=0)
printf("No.which left last is %d\n",num[i]);
}

N输入13就可以了。

循环链表,简单多了:其中M为报数的最大值,N为人数
#define N 11
#define M 3
#include "stdio.h"
#define NULL 0
struct person
{
int num;
struct person *next;
};
main()
{
struct person per[N],*p,*previous;
int i;
for (i=0;i<N;i++)
{
if(i==N-1){per[i].num=N;per[i].next=&per[0];}
else {per[i].num=i+1;per[i].next=&per[i+1];}
}
p=per;
for (i=1;;i++)
{
if (i==M+1) i=1;
if (i==M)
{
previous->next=p->next;
printf("%4d",p->num);
}
previous=p;
p=p->next;
if (p==previous) break;
}
printf("\nthe final person is:%d",p->num); getchar();
}