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

posted @ 2013-10-12 17:41  Andy Cheung  阅读(5496)  评论(1编辑  收藏  举报