有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);

你可能感兴趣的:(顺序)