多语言展示
当前在线:358今日阅读:145今日分享:43

IT初学者如何去理解约瑟夫环?

据说著名犹太历史学家 Josephus有过以下的故事:他参与并记录了公元66-70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住邱达伯特城,在坚持了47天之后,城市失守,沦陷后,他和40名英勇的将士退到附近一个洞穴躲藏起来。大家都表决说宁死不降,于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由大家排成一个圈,报数决定的,他有预谋地把自己安排在最后一个报数的位置,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品一起投降了罗马。  通常我们解决这个问题的时候,都会用到链表,解决问题的核心步骤如下:(程序的基本算法)1.建立一个具有n个链结点,无头结点的循环链表;2.确定第1个报数人的位置;3.不断地从链表中删除链结点,直到链表为空。  但是一个初学者如何去解决这个问题呢?  我们可以用的方法也很多,比如说:1,用数组标记法,先初始化为0,然后每个自杀的人的数值改为1,循环遍历判断到最后一个被标记完为止;2,用数组记录所有的人,然后每个报到相应数字的打印出来,然后删除掉,后面的往前移动,循环到剩下最后一个为止;  或者用递归,递推等等,在这里,我简单介绍一下上面第二个方法,以便初学者容易理解这个打印的过程。#include #include int main(void){int k = -1;int m = 0;int n = 0;printf('请输入N M :');scanf('%d %d', &n, &m);int a[n];int i = 0;for ( i = 0; i < n; i++ ){a[i] = i+1;}printf('\n');int q = 0;for ( ;; ){k = k + m;if ( k >= n ){k = k % n;}printf('%d ', a[k]);int j = 0;for( j = k; j < n-1; j++ ){a[j] = a[j+1];}n--;k--;if ( n < 1 ){break;}}printf('\n');return 0;}
推荐信息