约瑟夫环的多种解决方案
一、问题描述
n个人(n > 2)围坐一圈,从第i个人开始报数,报到m的人出圈,直到全部人出圈。要求编程模拟出圈过程,并输出出圈人的编号(不是下标)的顺序。这就是约瑟夫环问题。要求程序段的核心功能行数最好控制在10行以内。
解决该问题有多种方案,可以采用循环数组
的方式,也可以采用数组链表
的方式。
二、循环数组
首先申请一个n个元素的数组空间,全部设置为0,表示所有人都在圈内,之后设立一个计数器,从零开始计数,记到指定数目时有人出圈,将计数器清零,该人出圈,从下一个人开始继续计数。
int joseph(const int init_count, const int out_num)
{
char *circle = NULL;
int i = 0;
int count = 0;
int max = init_count;
if (init_count <= 0 || out_num <= 0)
return -1;
circle = calloc(sizeof(char), init_count);
if (circle == NULL)
return -