您的位置:首页 > 其它

Josephus 约瑟夫 问题

2010-08-19 15:16 267 查看
http://baike.baidu.com/view/717633.htm

链表方法
  这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p->link=head   解决问题的核心步骤:(程序的基本算法) 1.建立一个具有n个链结点,无头结点的循环链表; 2.确定第1个报数人的位置; 3.不断地从链表中删除链结点,直到链表为空。

int main()
{
int n,m,i,s = 0;
printf("N M =");
scanf("%d%d",&n,&m);
for(i = 2; i <= n; i++)
{
s = (s + m) % i;
}
printf("\n The winner is %d\n",s+1);
}


这个算法的时间复杂度为O(n),相对于模拟算法已经有了很大的提高。算n,m等于一百万,一千万的情况不是问题了。可见,适当地运用数学策略,不仅可以让编程变得简单,而且往往会成倍地提高算法执行效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: