想象有N盏灯,每盏灯都有一个独立开关,开关的编号从1-N,由一条线排列且现灯均关,依照倍数开关灯。即切换所有编码为1的倍数开关,然后切换所有编码为2的倍数开关,最后切换所有编码为3的倍数开关,以此类推,直到切换编码为N的倍数开关。(一次切换指的是将关着的灯打开,或将开着的灯关上。) 当完成100步(N=100)操作后,哪些灯是开着的,哪些灯是关着的?你发现规律了吗?你能说明原因吗?
这道题其实是一道优化算法,用我们小学五年级就可以到的找规律可以得到:
切换灯开关完成所有操作之后,只有编号为1 4 9 16 25 36 49 64 81 100的灯也就是编号为平方数这些灯还在亮着。
编号为N的灯泡为例,在X操作之后,只有在X的是N的因数的情况下,灯泡N的情况才能变化。(因数指的是可以整除N的数)。所以大多数因数都是成对出现的,假如J是是N的因数,那么N/J也是N的因数。只有在 J=N/J 时,因数(开关灯的次数)的个数为奇数。如:
1 - 4为例://“1”和“0”分别表示“开”和“关”两种情况
0 0 0 0 //初始
1 1 1 1 //因数1
1 0 1 0 //因数2
1 0 0 0 //因数3
1 0 0 1 //因数4
//1的因数为1;4的因数为1,2,4;........
可得奇数因数个数为开灯。
由J=N/J可得N=J^2,故只需知道1-N个数有几个平方数即可。