《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;
}
祝你早日攒够失望,然后开始新的生活。
原文地址:https://www.cnblogs.com/LuRenJiang/p/6441892.html