在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想死去,那么他应该怎样安排他和他的朋友的位置,才能逃脱这场死亡游戏呢?
用C语言解决约瑟夫环问题的最佳方式是采用循环链表,但使用数组同样也可以解决瑟夫环的问题。采用循环链表的方法,以后详述。本节主要讲解如何用数组的方式解决约瑟夫环的问题。
程序如下所述:
#include<stdio.h> #define LEN 41 void main(){ int a[LEN]; for(int i=0;i<LEN;i++){a[i] = 1;} // 数组初始化,1:表示为活着;0:表示自杀 int leftCount = LEN; // 计数器leftCount:计数剩下的人 int index = 0,count = 0; // 1.数组下标index;2.循环计数器count while(leftCount>2){ // 当还剩下两个人结束 if(a[index] == 1){ count++; if(3 == count){ // 计数到3,1.自杀;2.循环计数器count重新开始计数;3.计数器leftCount减1 a[index] = 0; count = 0; leftCount--; } } index++; if(index == LEN){index = 0;} // 当到数组尾,数组下标index置零,重新开始 } for(int j=0;j<LEN;j++){ // 输出结果 if(1 == a[j]){ printf("剩下两个人为第%d个\n",j+1); } } }
输出结果为:
时间: 2024-10-01 06:27:00