有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

时间:2023-03-09 07:31:22
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

先写我的思路,没有用指针的做法。如果你用的是VC,把第六行去掉。

#include<stdio.h>
#include<stdlib.h> int main()
{
setvbuf(stdout,NULL,_IONBF,0);
int n,num; //n为总人数,num为剩余人数。
int a[255]={0}; //用0标记此位置有人,若此位置的人退出,则该位置的值为1
int i;
int flag=0; //flag为报数 printf("How many people?");
scanf("%d",&n);
num=n; //剩余人数初始为n while(num!=1) //剩余人数为1时,停止循环
{
for(i=0;i<n;i++)
{
if(a[i]==0) //若该位置有人,就报数
flag++;
if(flag==3) //若报数为3,此人退出
{
flag=0;
a[i]=1;
num--;
} }
} for(i=0;i<n;i++) //遍历数组,第一个值为0的位置处就是剩余的人了
{
if(a[i]==0)
{
printf("The remaining person is NO.%d.",i+1);
//数组的序号从0算起,而人的编号从1算起,所以有+1的修正
break;
}
}
return EXIT_SUCCESS;
}

参考答案的算法基本和我的差不多

区别有:

1 每个位置上刚开始赋值为每个人的编号1-n,有人退出后,该人的位置赋值为0;

2 把每个用数组形式表示的a[i]转换为*(p+i),p当然事先定义并赋值为p=a,不过这个区别不是很大哈。

最后一个循环可以用while来实现,很是简洁:

  i=0;

  while(a[i]==1)

    i++;

  printf("The remaining person is NO.%d.",i+1);