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

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

吃猫的鱼
2022-12-19 / 0 评论 / 158 阅读 / 正在检测是否收录...

题目描述

该题目是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<n;i++){                //输出唯一的属性为1的元素
        if(people[i]==1){
            printf("%d",i+1);            //输出是剩下的是第几个人
        }
    }
}

0

评论 (0)

取消
友情链接 文章阅读: 网站地图