C/C++编程题 约瑟夫环问题分析
来源:互联网 发布:微官网制作哪个软件好 编辑:程序博客网 时间:2024/06/06 03:59
问题描述:有m个人,围成一个环,编号为 0、1、2、3、、、m-1,从第一个人开始循环报数,假设数到n的那个人出列,然后从下一个人继续数数,数到n出列,以此循环,最后那个人为胜利者,求胜利者的编号。
分析:
设m为人的个数 n为要数的数 k为从第几个人开始数
第一次的数列,记为A
0 1 2 3 4 5 6 7 8 9 、、、n%m k、、、m-2 m-1
假设第一次出列了一个人,则编号肯定为n%m-1(减1因为从零开始)。k=n%m,第一次出列后的数列为
0 1 2 3 4 5 6 7 8 9 、、、k、、、m-2 m-1
第二次从k开始数数那么可以组成新的数列,记为数列B
k->0
k+1->1
k+2->2
k+3->3
、
、
、
k-3->m-3
k-2->m-2
如果我们知道了数列B的最终胜利者是的编号是x,那么x在原来数列A中的编号是多少呢?很容易算出来:(x+k)%m,而k=n%m,替换后为(x+n%m)%m=(x+n)%m,(x+n)%m为数列A的胜利者。那么x又该如何求呢,我们可以求数列C,就这样这么以次类推。直到只有一个人时,胜利者的编号肯定为0.
假设f(y)为胜利者:则有
f(1)=0;
f(2)=(f(1)+n)%2;
f(y)= (f(y-1)+n)%y;(公式) y为数列的人数 n为要数的数
分析:
设m为人的个数 n为要数的数 k为从第几个人开始数
第一次的数列,记为A
0 1 2 3 4 5 6 7 8 9 、、、n%m k、、、m-2 m-1
假设第一次出列了一个人,则编号肯定为n%m-1(减1因为从零开始)。k=n%m,第一次出列后的数列为
0 1 2 3 4 5 6 7 8 9 、、、k、、、m-2 m-1
第二次从k开始数数那么可以组成新的数列,记为数列B
k->0
k+1->1
k+2->2
k+3->3
、
、
、
k-3->m-3
k-2->m-2
如果我们知道了数列B的最终胜利者是的编号是x,那么x在原来数列A中的编号是多少呢?很容易算出来:(x+k)%m,而k=n%m,替换后为(x+n%m)%m=(x+n)%m,(x+n)%m为数列A的胜利者。那么x又该如何求呢,我们可以求数列C,就这样这么以次类推。直到只有一个人时,胜利者的编号肯定为0.
假设f(y)为胜利者:则有
f(1)=0;
f(2)=(f(1)+n)%2;
f(y)= (f(y-1)+n)%y;(公式) y为数列的人数 n为要数的数
以下为编程实现,将f(y)替换为number y替换为i
/*************************************************************************m总人数,则标号为0~m-1 n为要数的数**成功返回序号1~m,失败返回-1***********************************************************************/int winner(int m, int n){ int i; int number; if (m <= 0 || n <= 0) { return -1; } number = 0; /* 当只有一个人时,编号为0的出圈 */ for (i = 2;i <= m;i++) { /* 循环m-1次将剩下一个人 */ number = (number + n % i) % i; /* 这样写易理解,或(number+n)%i */ } return number + 1; /* 程序从0编号,返回时应+1 */}
0 0
- C/C++编程题 约瑟夫环问题分析
- c之约瑟夫环问题
- C语言/约瑟夫环问题
- 【C语言】 约瑟夫环问题
- 约瑟夫环问题 (c / c++)
- 约瑟夫问题求解(C++)
- 约瑟夫问题(c++)
- 约瑟夫环问题的C版本答案
- 约瑟夫环问题的C版本答案
- 约瑟夫环问题 数据结构 c语言
- 用c解决约约瑟夫环问题
- 约瑟夫环问题(Josephus)的C解法
- (C语言)约瑟夫环问题
- C语言实现约瑟夫环问题
- C语言求解约瑟夫问题
- 约瑟夫问题 C语言代码
- 数据结构 C语言 约瑟夫问题
- C 约瑟夫环
- T- SQL性能优化详解
- Textarea ctrl+enter实现换行,用enter实现表单提交
- 求a的连续和
- cocos2d-x 3.2 使用ndk r10d编译问题
- Build your own Router in Go
- C/C++编程题 约瑟夫环问题分析
- 途新科技签约高顿财经培训Call Center(呼叫中心)项目
- 虚拟机类加载机制.
- 杭电2033 人见人爱A+B
- mysql报错Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
- ObjectiveC中的block用法解析
- 浅谈对JS闭包的理解
- 关于ajax的下载被浏览器阻止的问题
- [转载] 机器学习科普文章:“一文读懂机器学习,大数据/自然语言处理/算法全有了”