问题描述
已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌上。指定编号为k的人开始从1报数,数到m的那个人出列;出列那个人的下一位又从1开始报数,数到m的那个人出列;以此规则重复下去,直到圆桌上的人全部出列。
分析解决
解决方法主要有逻辑分析、数学分析法。
逻辑分析:就是按照游戏规则一个个报数,报到m的人出局,结构层次简单清晰明了。这种方式实现主要采用顺序表实现
数学分析:采用数学方式归纳统计分析出每次出局人的规律,直接得出每次出局的人,然后以代码实现。这种方法需要较强的数学分析能力,代码较简单。这种实现主要采用数学公式。
逻辑分析
先以C语言数组为例,由于C语言数组不能像Java、Python这种面向对象语言的数组那样使用删除数组元素的方法,每次删除数组中的一个元素,都要将后面元素前移一位,这里简单的将删除的元素值设为0。
假设总人数n=7,从编号k=2的人开始,数到m=3的人出局,下面是分析过程。
1 #include
2
3 int main(void)4 {5 int total; //define total people
6 int out; //define out number
7 int start; //define start number
8
9 /*set the total, out and start number*/
10 printf("Please enter the total people\n");11 scanf("%d", &total);12 printf("Please enter the out number\n");13 scanf("%d", &out);14 printf("Please enter the start position\n");15 scanf("%d", &start);16
17 int people[total]; //init the people
18 int i = start - 1; //init i for people tag
19 int count = 0; //init count for the people out
20 int remain = total; //init the remain number of people
21
22 /*init josephus ring*/
23 int j = 0;24 for (j = 0; j < total; j++)25 pe