《C语言程序设计》9.6

题目:

13个人围城一圈,从第一个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。


解析:

由题意得,所有人会一个个退出,让求最后留下来的那个人,可以想到让退出的人记上一个标记,转完一圈圈后,只会留一个人,然后遍历所有人,没被标记的则是最后留在圈子中的人。

实现:代码如下

#include <stdio.h>
#include <stdlib.h>
#define N 13
struct person
{
    int number;
    int nextp;
}link[N+1];
void CreastLink(struct person link[]);
int main()
{
    int b=0,k,j,i;//b(退出的人数),k(1,2,3),j(当前处理的结点号)
    CreastLink(link);
    j=N;
    while((N-b)>1)//因为要一圈圈的报数,一个个标记所以想到while循环,循环必定有跳出循环的条件,也就是要等圈内只有一个人就停止即(N-b)>1
    {
        k=0;
        while(k!=3)
        {
            j=link[j].nextp;//指向下一个结点
            if(link[j].number)
                k++;
        }
        link[j].number=0;
        b++;
    }
    for(i=1;i<=N;i++)
    {
        if(link[i].number)
            printf("%d",link[i].number);
    }
    return 0;
}
void CreastLink(struct person link[])
{
    int i;
    for(i=1;i<=N;i++)
    {
        link[i].number=i;
    }
    for(i=1;i<=N;i++)
    {
        if(i==N)
        {
            link[i].nextp=1;
        }
        else
        {
            link[i].nextp=i+1;
        }
    }
    return;
}

 

posted @ 2017-02-25 15:19  路人姜。  阅读(138)  评论(0编辑  收藏  举报