以下是本人的一些分享,我热爱编程,希望能多交编程的爱好者,如果你也是其中一名,那么请加好友,大家关注一下,下面的文章是自己觉得一些有用的东西,留下来给自己当笔记,当然也希望能帮助到你,首先感谢你的阅读~!
据说著名犹太历史学家 Josephus有过以下的故事:他参与并记录了公元66-70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住邱达伯特城,在坚持了47天之后,城市失守,沦陷后,他和40名英勇的将士退到附近一个洞穴躲藏起来。大家都表决说宁死不降,于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由大家排成一个圈,报数决定的,他有预谋地把自己安排在最后一个报数的位置,并且,作为洞穴中的两个幸存者之一,他说服了他原先的牺牲品一起投降了罗马。
通常我们解决这个问题的时候,都会用到链表, 解决问题的核心步骤如下:(程序的基本算法)
1.建立一个具有n个链结点,无头结点的循环链表;
2.确定第1个报数人的位置;
3.不断地从链表中删除链结点,直到链表为空。
但是一个初学者如何去解决这个问题呢?
我们可以用的方法也很多,比如说:
1,用数组标记法,先初始化为0,然后每个自杀的人的数值改为1,循环遍历判断到最后一个被标记完为止;
2,用数组记录所有的人,然后每个报到相应数字的打印出来,然后删除掉,后面的往前移动,循环到剩下最后一个为止;
或者用递归,递推等等,在这里,我简单介绍一下上面第二个方法,以便初学者容易理解这个打印的过程。
#include <stdio.h>
#include <stdlib.h>
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;
}
我们在通过不间断地学习,才能获取真正的知识,从来不满足现在所拥有的知识,不断进取是根本,在编程的世界里也是这样,我喜欢获得新的知识,为获得新的知识兴奋,希望你也是一样,学无止境!!!
更多知识请参阅广州达内,或咨询广州达内老师
正文
理解约瑟夫环,学会用到链表2013-03-28 10:28:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/javaxx/54152.html
阅读(2377) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论