约瑟夫问题
来源:互联网 发布:全国手机号码数据库 编辑:程序博客网 时间:2024/06/05 00:56
约瑟夫问题
问题描述:有1到n共n个人围成一个环,从1开始每数2个退一个,求最后剩下的那个人的编号例如:1、2、3、4、5 退出的顺序为2、4、1、5、3,即最后剩下3
假如初始我们有2n个人,在第一轮完成之后,我们剩下1、3、5、7...2n-3、2n-1接下来要退出的就是3,这个过程和初始有n个人非常像,不同的是这个过程每个人的编号变成了2n-1
假设f(n)表示初始n个人时最后剩下的人的编号,由上可以得到f(2n) = 2f(n) - 1 (n >= 1)
另一种情况,假如初始有2n+1个人,当2n退出时,接下来编号1的人会退出,剩下n个数为:
3、5、7、9...2n-1、2n+1
又得到了类似的情况,不过这次相对应的编号是2n+1
所以得到:f(2n+1) = 2f(n) + 1 (n >= 1)由上可得:
(1) f(1) = 1(2) f(2n) = 2f(n) - 1
(3) f(2n + 1) = 2f(n) + 1由此可以得到
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16f(n) 1 1 3 1 3 5 7 1 3 5 7 9 11 13 15 1
可以发现按2的幂可以将数据分组1、2 ~ 3、4 ~ 7、8 ~ 15...再对照f(n)可以得到
f(2^m + k) = 2k + 1 (m >= 0 & 0 <= k < 2^m) (PS:如果2^m <= n < 2^(m + 1),k = n - 2^m, 0 <= k < 2^m)证明:
首先f(2^m) = 1,有f(2n) = 2f(n) - 1可得令n = 2^m + k,当执行k次退出后,剩下2^m个人,这些人中第一个人即为最终留下来的,编号为2k + 1
得证另外
设n用二进制表示n = (bmbm-1...b1b0)2 其中bm = 1由于n = 2^m + 1 则:
k = (0bm-1...b1b0)22k = (bm-1...b1b00)2
2k + 1 = (bm-1...b1b01)2f(n) = (bm-1...b1b0bm)2
由此可知:f(n) 即整数n的二进制表示循环左移一位源自:具体数学
- 约瑟夫问题、约瑟夫环
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题
- C++第九周实验报告
- 如何使用 TinyXML 在内存中操作 xml 格式的内容
- 第十周C++实验报告
- 信号量与自旋锁 |Linux,信号量,自旋锁,睡眠锁,spinlock,semaphore 【转帖】
- 《应用Rails进行敏捷Web开发》第四版部分翻译--windows下安装rails
- 约瑟夫问题
- 第十一周C++作业报告(一)
- 制作grub引导定制LFS
- export ,source 理解shell变量的生存周期
- NSString 十六进值
- 为了提高微博粉丝数量,把猎头都加上了
- Linux 的多线程编程的高效开发经验
- C++第十二周实验报告
- eclipse 快捷键大全