关灯问题

来源:互联网 发布:一个域名绑定两个ip 编辑:程序博客网 时间:2024/04/27 16:16

灯分析

原题

有100盏灯,依次编号1-100,初始都是关着的。第1次遍历,打开全部的灯;第2次遍历,关掉第2盏、第4盏等被2整除的灯;第3次打开被3整除的灯;第i次,对被i整除的灯做如下操作

  • 如果灯开着,就关掉

  • 如果灯关着,就打开

如此交替进行,直到100次遍历完毕,请问,还有多少盏灯亮着。

分析

这个题目比较好玩儿,路子走对了,很简单。想不对,方法就不是那么美。

例如,方向不对的话,就按照题目的意思,一遍又一遍的遍历,直到结束,时间复杂度是O(n^2)的。也能够解决问题,但是复杂了。

那么怎么办呢?上面的遍历的做法,是横向的思路,现在我们纵向思考。一盏灯,会在那几次被操作。例如编号为100的灯:

  • 第1次能够操作,打开

  • 第2次能够操作,关闭

  • 第4次能够操作,打开

  • 第5次能够操作,关闭

  • 第10次能够操作,打开

  • 第20次能偶操作,关闭

  • 第25次能够操作,打开

  • 第50次能够操作,关闭

  • 第100次能偶操作,打开

最终编号为100的灯是打开的。再来看编号为70这盏灯:

  • 第1次能够操作,打开

  • 第2次能够操作,关闭

  • 第35次能够操作,打开

  • 第70次能够操作,关闭

最终编号为70的灯关闭着。

通过上面两个例子,我们会发现,1,2,4,5等都是能够整除100;1,2,35,70都能够整除70。 所以,编号为n的灯,有多少个因数,就有会被操作多少次。很显然,如果是偶数次,则灯一定是关着的。 那什么情况下,操作会是奇数次呢?一个数,每次分解,都是两个数相乘,只有当这两个数相同的时候,才会是偶数次。 所以,最终会亮着的灯,都能够开平方,得到一个正整数:1,4,9,16,25,36,49,64,81,100.

【分析完毕】

原创粉丝点击