求大神用C语言写约瑟夫双向生死问题,不要用C++

据说著名的犹太历史学家约瑟夫斯有这样一个故事:罗马人占领乔塔帕特后,39个犹太人与约瑟夫斯和他的朋友一起躲在一个山洞里,39个犹太人决定去死而不愿被敌人看到,于是他们决定。

在自杀模式下,41人组成一个圈,第1人开始数,每数到第三个人,这个人就必须自杀。

然后下一个人再数,直到所有人都自杀。

然而,约瑟夫斯和他的朋友们不想服从。约瑟夫斯要求他的朋友先假装服从,他安排他的朋友和自己在一起。

在16和31位置,躲过了死亡游戏。

解约瑟夫斯问题可以用代数分析法求解,拓展了问题。假设你现在不幸和M个朋友扯上了关系。

有了这个游戏,你如何保护自己和朋友?画两个圈就可以让自己和朋友免于死亡。

玩,这两个圈的内圈是排列顺序,外圈是自杀顺序,如下图所示:

如果用程序解决问题,只需要把数组当成一个环。在数组中,你从1开始计数,每找到三个。

如果没有数据区,填充一个计数,直到计数达到41,然后从索引1开始列出数组,就可以知道每

一个位置的自杀顺序,也就是约瑟夫排列,如下:41人和约切夫排列的报数3:

14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12

22 33 13 29 23

从上面可以看出,最后一次自杀是在31位置,而倒数第二次自杀是在16位置,之前。

所有人都死了,所以他们不知道乔切夫和他的朋友们没有遵守游戏规则。

# include & ltstdio.h & gt

# include & ltstdlib.h & gt

#定义N 41

#定义M 3

int main(void) {

int man[N]= { 0 };

int count = 1;

int i = 0,pos =-1;

int alive = 0;

while(count & lt;= N) {

做{

pos =(pos+1)% N;//戒指治疗

if(man[pos] == 0)

i++;

If(i == M) {//报告数为3。

I = 0;

打破;

}

} while(1);

man[pos] =计数;

count++;

}

Printf ("\ nJocheff排列:");

for(I = 0;我& ltn;i++)

printf("%d ",man[I]);

printf(" \ n \ n您想救多少人?");

scanf("%d ",& amp活着);

Printf("\nL表示应该放置%d人的位置:\n ",活着);

for(I = 0;我& ltn;i++) {

if(man[I]& gt;活着)

printf(" D ");

其他

printf(" L ");

if((i+1) % 5 == 0) printf("

");

}

printf(" \ n ");

返回0;}