不染


私信TA

用户名:dotcpp0697641

访问量:94

签 名:

等  级
排  名 9949
经  验 1120
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

不采取删除被淘汰者的方式,固定总人数,用0代表被淘汰,1代表未被淘汰。指针顺次指向每个人以模拟报数过程,当每轮次指针指向最后一人时,用while循环使其指回第一人。具体见代码注释。
注意事项:

参考代码:

#include<stdio.h>

#include<string.h>

#include <math.h>

int main()

{

    int N=0;

    scanf("%d",&N);//输入玩家数

    int id[100]={0};

    for(int i=1;i<=N;i++)

        id[i]=i;//人员最初编号

    int number[100];//人员报数编号(1或2或0,此处采取取余的方式,所有3的倍数对3取余都是0)

    for(int i=1;i<=100;i++)

        number[i]=1;

    int flat=0,m=0;//flat记录总报数次数,m记录一个回合被淘汰的人数。

    int *p=id;

    while(N-m>1)//当剩余人数不止一人时

    {

        p=&id[1];//从所有玩家的第一个开始

        m=0;//每轮次重新统计被淘汰人数

        for(int i=1;i<=N;i++)

        {

           if(number[i]!=0)//若玩家未被淘汰

           {

               flat++;//报数次数加一

               number[i]=flat%3;//获得所报数字

               p++;//指向下一人

           }

           if(number[i]==0)//若玩家已被淘汰

            {

                p++;//不增加报数次数,直接跳过他

                m++;//记录已淘汰人数。

            }

        }

    }

    for(int i=1;i<=N;i++)//打印最终的胜利者编号,即所报数字非0的玩家号

    {

        if(number[i]!=0)

            printf("%d",id[i]);

    }

    return 0;

}



 

0.0分

0 人评分

  评论区

  • «
  • »