51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

c语言实现n人围圈报数,报到3的人退出圈子,求最后留下的是几号位的人?

题目描述



有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?


该题目是c程序设计课本上的一道课后习题,今天刚好做到,在此分享一下我的解法。

题目解析

首先,我们需要弄一个数组,来表示人,1代表人还在位置上,0代表人已经退出圈子。

由于题目的要求是人是围圈一直报数,因此我们需要判断报数是否已经到了最后一个,要是人到了最后一个,需要重置回数组的第一个元素。

另外,需要判断当前的座位是否有人,要是没人,就直接跳过当前位置。要是有人,报数+1。然后判断报数的数字,是否报到3,如果报了3,将当前数组的元素赋为0,并且将报数重置为1。

循环结束条件是,当前的数组只剩一个元素为1,我们可以设置一个变量专门记录剩余人数,每当坐下一个人,剩余人数减一。

代码

#include<stdio.h>
#include<stdlib.h>
void main(){
    int people[5]={0};                        //n变量代表有n个人
    for(int i=0;i<5;i++){                    //给people变量赋值1,代表当前的人还在报数,0则代表该位置的人已经空了
        people[i]=1;
    }

    void sort(int people[5],int n);
    sort(people,5);                            //需要n传入有多少人参与排序
    system("pause");    




}


void sort(int people\[5\],int n){
int now=1,least=n,now_people=0;        //now变量代表是当前的报数为多少,least变量表示当前当前剩余的人数,now_people是指当前轮到哪个人报数
do{
if(now_people\>n-1){            //判断当前轮到的人是否超出最多人数,如果超出,则变成0
now_people=0;
}
if(people\[now_people\]==0){        //如果当前为空,就往前加一个
now_people++;
}else{                            //如果当前不为空
if(now==3){                    //如果报数是三,那么当前的元素就变成0
people\[now_people\]=0;
least--;
now=1;                    //重置报数
}else{
now++;
}
now_people++;
}

}while(least\>1);                                    //当人数仅剩一人的时候跳出循环


    for(int i=0;i&lt;n;i++){                //输出唯一的属性为1的元素
        if(people[i]==1){
            printf("%d",i+1);            //输出是剩下的是第几个人
        }
    }



`}`


赞(1)
未经允许不得转载:工具盒子 » c语言实现n人围圈报数,报到3的人退出圈子,求最后留下的是几号位的人?