哇咔咔


私信TA

用户名:zmb583068630

访问量:1733

签 名:

等  级
排  名 4145
经  验 1759
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校 华侨大学
专  业

  自我简介:

解题思路:这个题目花了我好长时间,因为还不会链表。 

1,这个题目是要有n个人,所以就是说会出局n-1个人,因此每出局一个人便会计数一次。 

2,又由于是转成圈圈,考虑让循环一直循环,并且有一个计数可以随着循环一直累加下去,直至达到终止条件。

3,又由于需要的剩下人的序号,所以考虑一个自然数数组,并且让计数为3的倍数时让那个数变为0,且当再一次扫描那个数时,不作任何处理。

4,欲更加了解,请看代码。


注意事项:

参考代码:

#include<stdio.h>

int main(){

    int n,i,m;  //n为总的人数,i是为了循环用,m是为了让总循环停止而设置的一个数

    int l=0;    //l是总的计数

    int t=0;    //t是为了要记所需要的序号

    int *p;     //这一部分是给n以及数组赋值

    scanf("%d",&n);

    int a[n];

    m=n;

    p=&a[0];

    for(i=0;i<n;i++)

        *(p+i)=i+1;

    while(m){   //循环的终止条件为当所有数组的数都变为0时

        for(i=0;i<n;i++){

            if(a[i]!=0){   //当那个人还没有出局的时候,就可以报数,其实也可以理解成,当那个人                            //报数为3的倍数时,就会出局。

                t=a[i];    //存在的人的序号就会被赋值给t,一直到最后一个,最后一个被赋值的即                            //为胜利者

                l++;

                if(l%3==0){  //这是筛选出被淘汰的人的序号,并被赋值为0,以后不会再参加有效的                              //循环

                   a[i]=0;

                   m--;      //每淘汰一人,计数就减一,直至为0

                }

            }       

        }

    }

    printf("%d",t);//输出的为最后一个变为0的那个数组的元素值,即为胜利者。

    return 0;

}


 

0.0分

0 人评分

  评论区

  • «
  • »