现在有编号为1~87654321的灯初始状态是全开着的,现进行如下操作:
编号是1的倍数的灯拨一下开关;
编号是2的倍数的灯再拨一下开关;
编号是3的倍数的灯再拨一下开关;
…………
如此直到87654321的倍数。
问:此时还有多少盏灯仍然是开着的。
------------------------------------------------------------------------------------------------------------------------
这种复杂的问题 不能使用暴力来解决,那么需要我们来找规律了~~
首先考虑:
一、灯亮着的灭着的区别么?
初始状态的时候都是开的,我们可以从被按的次数方面来分析,被按的次数可以分为:
偶数次:列如 4次 关 开 关 开
奇数次:列如3次 关 开 关
这样就明了,当按的次数为偶数次的时候,灯是亮的,为奇数次的时候,灯是关的。
那么下面我们思考第二个问题。。
二、被按的次数由什么决定?
我们来分析编号为100的这盏灯,
编号为1的倍数情况下:按开关, 此时灯的情况是熄灭的。
编号为2的倍数情况下:按开关,此时灯的情况是开亮的。
编号为4的倍数情况下:按开关,此时灯的情况是熄灭的。
编号为5的倍数情况下:按开关,此时灯的情况是开亮的。
编号为10的倍数情况下:按开关,此时灯的情况是熄灭的。
编号为20的倍数情况下:按开关,此时灯的情况是开亮的。
编号为25的倍数情况下:按开关,此时灯的情况是熄灭的。
编号为50的倍数情况下:按开关,此时灯的情况是开亮的。
编号为100的倍数情况下:按开关,此时灯的情况是熄灭的。
1,2 ,4,5 10 20 25 50,100 可以看到这些数字全部都是100的约数。
那么可以得出编号为N的灯,他的被按的次数,就是N 约数的个数。。
三、那约数的个数奇偶由什么决定?
我们来分析几个数字的约数把
50 1,2,5,10,25,50
49 1,7,49 //个数为奇数
48 1,2,3,4,6,8,12,16,24,48。
47 1,47
46 1,2,23,46
45 1,3,5,9,15,45
44 1,2,4,11,22,44
43 1,43
42 1,2,3,6,7,14,21,42
41 1,41
40 1,2,4,5,8,10,20,40
39 1,3,13,39
38 1,2,19,38
37 1,37
36 1,2,3,4,6,9,12,18,36 //约数个数为奇数
可以发现 49 和 36 她们的约数个数为奇数。。
那么我们来分析一下49和36的特质
49=7^2;
36=6^2;
这些数字都是平方数,那么我们换个数字来验证一下把
5^5 等于 25
25的约数:1、5、25 -- 3个约数 为奇数 那么 25 一定是关灯的,不信我们来验证一下。
编号为25的灯,默认状态是开亮的。
当编号为1的倍数时:按开关,灯熄灭,
当编号为5的倍数时,按开关,灯开亮,
当编号为25的倍数时,按开关,灯熄灭,
果然 结果如预测所料!!
那么我们可以由此得出结论 ---
1^2、 2^2、 3^2、 4^2 、5^2、 6^2 等等---- 编号为这些平方的值的数字一定是关灯的。
那么我们要求87654321里面有多少个这样的数字呢 我们对其开平方即可~~
在java里面可以使用 Math.sqrt(); 方法
那么我们代码可以这些写
int i = 87654321 - (int) Math.sqrt(87654321);
由于开出平方是double类型的我们可以转成int 去除小数,因为小数对我们来说没有意义!
列如 9 和 10 ,9里面的平方值的数字有 1 4 9 ,10里面也是 1 4 9 但是10开平方有小数所以小数对于我们来说没意义,我们用(int) 转换由int强转后的数字就是编号1-87654321 里面有多少栈灯熄灭,用总的减去熄灭的就等于亮的那么结果就是 :87644959
特别谢谢Teddy大神的指点迷津。