数据结构|约瑟夫环的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

浙公网安备 33010602011771号