一道经典题目
2014-10-29 09:58
190 查看
题目:有10个人围成一圈,从1到3循环报数,数到3的人退出,最后剩下的人是谁?
这道题,可以抽象成这样:有N个人围成一圈,从1到M报数,数到M的人退出,最后剩下的人是谁?
以前在写程序解这道题的时候都是用数组+for循环的方式实现。今天偶然见到一种牛逼方法:一个公式F(N) = (F(N-1)+M)%N;
此公式的推导过程如下:
1:假设有N个人 1 2 3 ..... N 数到M的出列
2:第一次第(M)个人 出列 也就是 1 2 M-1 ? M+1 ...N
3:这里有个问题 如果M大于N的话怎么办?
3.1:如果M小于N 那么出列的就是M
3.2:如果 M > N 那么就是M除以N的余数:例如 2 个人数到 3 第一个出列的就是 3%2 = 1;
3.3:针对第一种情况 M<N. M%N=M 所以 第一个出列的人就是M%N. 则 F(1) = M % 1 = 0。
4:第二次出列的人就是第一个出列的人再往后数M个人,也就是第2M个人出列 也就是 F(N-1) + M
5:这时就有个问题第一次出列的问题
6:所以第二次出列的就是 2M % N. 也就是 F(N) = (F(N-1)+M)%N
所以程序代码如下:
擦。两行代码就实现了。
数学太强大!!!!!!!!!!!!!!
这道题,可以抽象成这样:有N个人围成一圈,从1到M报数,数到M的人退出,最后剩下的人是谁?
以前在写程序解这道题的时候都是用数组+for循环的方式实现。今天偶然见到一种牛逼方法:一个公式F(N) = (F(N-1)+M)%N;
此公式的推导过程如下:
1:假设有N个人 1 2 3 ..... N 数到M的出列
2:第一次第(M)个人 出列 也就是 1 2 M-1 ? M+1 ...N
3:这里有个问题 如果M大于N的话怎么办?
3.1:如果M小于N 那么出列的就是M
3.2:如果 M > N 那么就是M除以N的余数:例如 2 个人数到 3 第一个出列的就是 3%2 = 1;
3.3:针对第一种情况 M<N. M%N=M 所以 第一个出列的人就是M%N. 则 F(1) = M % 1 = 0。
4:第二次出列的人就是第一个出列的人再往后数M个人,也就是第2M个人出列 也就是 F(N-1) + M
5:这时就有个问题第一次出列的问题
6:所以第二次出列的就是 2M % N. 也就是 F(N) = (F(N-1)+M)%N
所以程序代码如下:
public static int jie(int n, int m) { if (n == 1) return 0; else return ((jie(n - 1, m) + m) % n) ; }
擦。两行代码就实现了。
数学太强大!!!!!!!!!!!!!!
相关文章推荐
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
- 一道超经典的C++结构体的题目
- 一道经典的C++结构体的题目
- js的一道经典题目
- 2015 百度笔试的一道经典题目
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目) [c#]
- 一道经典的C++结构体的题目
- 一道微软面试时碰到的,经典的,关于字符串操作的面试题目
- 一道经典的C++题,关于分钱的问题,适合新手阅读(黑客X档案论坛题目)
- 一道经典的面向对象题目的JAVA实现
- 你感觉你是个JAVA高手吗,那么就来挑战一下吧,下面可是ACM一道很经典的题目,试一吧!
- 一道经典题目---虚函数继承和虚继承
- 一道关于public,private,protected继承的经典题目
- 经典的一道题目.
- java 面试中的一道截取字符串的经典题目
- 一道经典的C++结构体的题目
- 一道Amazon经典的题目,经常会考到,给一个target数字以及一个数组,求所有的加起来为这个数字的组合
- 一道经典的额递归题目
- 又是矩阵 Uva上的一道 经典题目
- 一道简单的但是经典的动态规划题目