关于约瑟夫_Joesphus问题(C语言数组解决)

来源:互联网 发布:编程熟练 编辑:程序博客网 时间:2024/06/03 21:06

再来回顾一下Joesphus问题:

约瑟夫问题:

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

那么将上述问题一般化,我们能得到:N个人围成一圈,并从1-N编号,从第一个开始报数,第M个将被杀掉。求依次被杀掉的人员编号。

用C语言来解决上述问题,以N=17,M=3为例,我们可以构建一个数组int people[N]  并将其所有元素初始化为-1,然后按照游戏规则将每人被杀掉的顺序赋给对应元素的值,最后按照被杀顺序来依次输出每个元素的下标+1即可。

#include<stdio.h>#define N 17#define C 3int main(void){    int people[N];    int i,j,index;    int count;    //每个元素初始化为-1    for(i=0;i<N;i++)        people[i]=-1;    i=0,index=0,count=0;    //约瑟夫式计数    while(i<N)  //确保给17人编号    {        if(people[index]==-1)            count++;        //跳过已经计数的元素        if(count==C)        {            people[index]=i;    //编号            count=0;    //count初始化为0后重新计数            i++;    //编号成功后自增        }        /*索引循环,到达N后归0*/        index++;        if(index==N)            index=0;    }    //依次输出    for(i=0;i<N;i++)        for(j=0;j<N;j++)            if(people[j]==i)                printf("%d ",j+1);    return 0;}