Josephu问题的数学解法
来源:互联网 发布:苹果下载软件itunes 编辑:程序博客网 时间:2024/05/22 13:46
今天重新做了次Josephu问题,之前做的是使用链表来实现的,直接模拟了整个过程,这次使用了数学解法。
Josephu问题:编号为0到N-1的N个人围成一圈,然后从1开始报数,报到M的那个人被杀掉,剩下的人接着从1开始报数,求最后的幸存者编号。
首先对于对于第一轮:
0, 1, 2, ......, M-2, M-1, M, M+1, ......N-2, N-1 ---------------------------------数组1 (N个人)
剩下的人:
0, 1, 2, ......, M-2, M, M+1, ......, N-2, N-1
对剩下的人的排列换成下面这样:
M, M+1, M+2, ......, N-2, N-1, 0, 1, 2, ......, M-2 --------------------------------数组2 (N-1个人)
很容易发现上面的数组2等价于:
{(x+M)mod N | x = 0, 1, 2, ......, n-3, n-2} ------------------------------------数组3;
很明显如果知道了数组2 中幸存者编号,那也等于知道了数组1中幸存者的编号;
而数组2 等价于数组3,所以现在问题变成了从 0到 n-2 的人中找幸存者;即假设我们从0到 n-2 中找到了幸存者编号为x,那么根据公式 (x + M)mod N 即可得到数组2 中的幸存者编号,也即数组1 N个人中的幸存者。
到此这个问题就是就可以总结为,如果知道了N-1个人中幸存者的编号,则可计算出N个人中幸存者的编号;
N应该大于等于1,而当N=1时,只有一个人,那幸存者编号就是x1=0(从0开始计数);接着可以计算出N=2时的幸存者编号x2=(x1+M)%2,然后利用N=2可以计算出N=3……;代码如下:
#include <stdio.h>#include <stdlib.h>int josephu(int n, int m);int main(int argc, char **argv){ int n, m; printf("please input N and M: "); scanf("%d%d", &n, &m); printf("result: %d\n", josephu(n, m)); return 0;}int josephu(int n, int m){ int ret = 0, i; for (i = 2; i <= n; i ++) ret = (ret+m) % i; return ret;}
- Josephu问题的数学解法
- Josephu问题的解决
- Josephu 问题的实现方法
- 约瑟夫问题的数学解法
- 约瑟夫问题的数学解法
- 约瑟夫问题的数学解法
- 约瑟夫问题的数学解法
- 约瑟夫问题的数学解法
- 约瑟夫问题的数学解法
- 约瑟夫问题的数学解法
- 约瑟夫问题的数学解法
- 约瑟夫问题的数学解法
- JosePhu问题
- Josephu问题
- Josephu问题的链表解决方案
- 约瑟夫问题的极简单数学解法
- 约瑟夫环问题的数学解法
- 约瑟夫环问题的数学解法
- vim常用命令
- 测试与开发人员的战斗
- UML概论
- 原码、反码、补码和移码其实很简单
- 过滤文件名非法字符
- Josephu问题的数学解法
- 浅析jQuery删除节点的三个方法
- [算法]CSDN编程挑战赛之整数取反
- sklearn学习记录一:官方使用说明
- 线程概述
- 仿微信源码共享
- ABAP内表操作
- java小组第一期攻克课题解答
- Linux卸载MySQL