码迷,mamicode.com
首页 > 其他好文 > 详细

趣题——打开的锁

时间:2015-02-12 00:48:38      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:趣题

题目:

在一个走廊里,按顺序排列着编号为1到100的100把锁,他们都是锁上的,要求在第一次从走廊一头走到另一头的时候,打开所有锁;第二次时,将编号为2的倍数的锁改变状态(从开到关,或从关到开);第三次时,将编号为3的倍数的锁改变状态;以此类推,问当第100次经过走廊的时候,哪些锁是开着的。


方法:

这题不会傻到让你把所有锁都画出来,即便这样,也不能够画完100次的状态。
我们首先模拟第一遍经过走廊,每把锁都要改变状态;
第二遍,编号为2,4,6,8,…,100的锁改变状态。

如果我要问第6把锁的最终状态,那么经过的步骤为:
1. 1,2,3,4,5,6...
2. 2,4,6...
3. 3,6...
4. 6...
对于编号为6的锁,有且只有以上这四次变换。

而我们知道偶数次变换是不会改变状态的,奇数次变换会使得结果跟初始状态刚好相反。
对于6而言,能够影响到它的状态的几次分别为:1的倍数,2的倍数,3的倍数和6的倍数。不难发现,这些都是数字6的因数,也就是说,要问一把锁的状态,只需要看它相应的编号有多少个因数即可。如果因数的个数为偶数个,则状态不变;否则,状态相反;但是,往往一个数的因数都是对称的,什么情况下,它的因数的个数是奇数个呢?
想想这些数:1,4,9,16,25…
他们的因数均为奇数个,因为他们是平方数。因此在100内(含)有多少个平方数,就有多少个最终被改变了状态的锁。而如何计算100内有多少个完全平方数呢?很简单:从1开始一个一个看,直到10的平方达到了100,因此最多有10个完全平方数。

发散一下:有n个编号从1到n的锁,按照规则经过了n次走廊,则最终有多少个锁变换了状态,还是从1开始,直到m,使得m^2<=n && (m+1)^2>n ,那么通式可以表示为floor(squrt(n)),floor表示求底,即不超过某数的最大整数。

趣题——打开的锁

标签:趣题

原文地址:http://blog.csdn.net/langduhualangdu/article/details/43745509

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!