数据结构|约瑟夫环的C语言实现(模拟数组法)

数据结构|约瑟夫环的C语言实现(模拟数组法)

问题:

1,2,···,n这n个人排成一个圆圈,从1号选手开始数数,每次从这个圆圈里让数第3个数字的选手退场(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个选手。

分析:

如果采用循环链表法,对于C语言来说代码量较大,不易实现,故采用模拟数组法。

用circle[n]数组记录各个选手在场情况,在循环体中采用变量j循环遍历数组,利用变量count记录离场人数,保证循环结束条件。

 

 

代码实现:

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);  //输入选手个数 
    
    int circle[n+1]; //从circle[1]开始记录第i号是否在场 
    int count = 0; //用于记录离场人数 
    int flag = 1; //用于记录每个人数的号码 
    
    for(int i = 1; i <= n+1; i++){  //初始化,默认circle[i] = 0表示为i号在场 
        circle[i] = 0;
    }
    
    for(int j = 1; count < n-1; j++){ //循环条件:当离场人数等于n-1 , 用j来循环遍历circle数组 
        if(j > n) //保证循环进行 
            j-=n;
        if(circle[j] != 1){ //当该人在场,判断数的数字是否是3的倍数 
            if(flag % 3 == 0){
                circle[j] = 1;
                count++; //离场人数加一 
            }
            flag++; //数的数字加一 
        }
        printf("circle[%d] = %d ,flag = %d\n",j,circle[j],flag); //调试用 
    }
    
    for(int i = 1; i < n; i++){ //遍历数组,找到最后剩下的人 
        if(circle[i] == 0){
            printf("%d\n",i);
        }
    }
} 

运行结果:

4
circle[1] = 0 ,flag = 2
circle[2] = 0 ,flag = 3
circle[3] = 1 ,flag = 4
circle[4] = 0 ,flag = 5
circle[1] = 0 ,flag = 6
circle[2] = 1 ,flag = 7
circle[3] = 1 ,flag = 7
circle[4] = 0 ,flag = 8
circle[1] = 0 ,flag = 9
circle[2] = 1 ,flag = 9
circle[3] = 1 ,flag = 9
circle[4] = 1 ,flag = 10
1

 

10
circle[1] = 0 ,flag = 2
circle[2] = 0 ,flag = 3
circle[3] = 1 ,flag = 4
circle[4] = 0 ,flag = 5
circle[5] = 0 ,flag = 6
circle[6] = 1 ,flag = 7
circle[7] = 0 ,flag = 8
circle[8] = 0 ,flag = 9
circle[9] = 1 ,flag = 10
circle[10] = 0 ,flag = 11
circle[1] = 0 ,flag = 12
circle[2] = 1 ,flag = 13
circle[3] = 1 ,flag = 13
circle[4] = 0 ,flag = 14
circle[5] = 0 ,flag = 15
circle[6] = 1 ,flag = 15
circle[7] = 1 ,flag = 16
circle[8] = 0 ,flag = 17
circle[9] = 1 ,flag = 17
circle[10] = 0 ,flag = 18
circle[1] = 1 ,flag = 19
circle[2] = 1 ,flag = 19
circle[3] = 1 ,flag = 19
circle[4] = 0 ,flag = 20
circle[5] = 0 ,flag = 21
circle[6] = 1 ,flag = 21
circle[7] = 1 ,flag = 21
circle[8] = 1 ,flag = 22
circle[9] = 1 ,flag = 22
circle[10] = 0 ,flag = 23
circle[1] = 1 ,flag = 23
circle[2] = 1 ,flag = 23
circle[3] = 1 ,flag = 23
circle[4] = 0 ,flag = 24
circle[5] = 1 ,flag = 25
circle[6] = 1 ,flag = 25
circle[7] = 1 ,flag = 25
circle[8] = 1 ,flag = 25
circle[9] = 1 ,flag = 25
circle[10] = 0 ,flag = 26
circle[1] = 1 ,flag = 26
circle[2] = 1 ,flag = 26
circle[3] = 1 ,flag = 26
circle[4] = 0 ,flag = 27
circle[5] = 1 ,flag = 27
circle[6] = 1 ,flag = 27
circle[7] = 1 ,flag = 27
circle[8] = 1 ,flag = 27
circle[9] = 1 ,flag = 27
circle[10] = 1 ,flag = 28
4

 

posted @ 2022-04-27 18:20  C₅H₁₂O₄季戊四醇  阅读(273)  评论(0)    收藏  举报