原题 有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.
【分析完毕】