趣题——打开的锁

题目:

在一个走廊里,按顺序排列着编号为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表示求底,即不超过某数的最大整数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值