有100盏灯,分别写上编号1~100,同样地 有100个开关,写上编号1~100。当我按1号开关,写上1的倍数的灯会开/关(如果灯开着就关,相反地,关着就会开),当我按2号开关,写上2的倍数的灯会开/关,如此类推

问题: 有100盏灯,分别写上编号1~100,同样地 有100个开关,写上编号1~100。当我按1号开关,写上1的倍数的灯会开/关(如果灯开着就关,相反地,关着就会开),当我按2号开关,写上2的倍数的灯会开/关,如此类推。

问:如果一开始所有灯都亮着,当我每个开关都按一下之后,会有几多盏灯会开着? 他们的编号又是什么?

首先的个人想法:

  • 根据编号能否被整除来确定是否按一次对应编号的灯,是相对独立的,意味着先按后按都没有关系,只要遍历所有操作就可以。
  • 那么反过来推想,能被100整除的数,只有100,所以100会被按一次,100熄灭,然后99只能被99整除,故99熄灭···
  • 以上类推,那么每个灯都会灭掉。所以亮着的灯是0盏。

总结分析:100的并不是只能被100整除,他还可以被2,4,5,20,25··等数字整除,意味着100号等不止被操作一遍,所以结果不正确。

再根据数学逻辑分析:

  • 显然,灯如果一开始就亮着,那么当它被操作偶数次的时候,它仍旧会亮着,当他被操作奇数次的时候,它会是熄灭的。
  • 这样一来,问题就是变成了每个编号的数字,在1~100里面有多少个约数。
  • 一开始尝试使用数学的方法找公因数,公倍数什么的简单解决,没有头绪,只好使用暴力破解,上代码,跑出结果来。
public void light(){
        HashMap<Integer,String> hashMap = new HashMap<>();
        //初始化状态为亮的
        for(int i=1;i<=100;i++){
            hashMap.put(i,"亮");
        }
        //遍历所有操作,并记录输出过程
        for(int i=1;i<=100;i++){
            System.out.println("_____________num:"+i+"__________________");
            for (int j=1;j<=100;j++) {
                if(j%i==0){
                    if (hashMap.get(j).equals("亮")) {
                        hashMap.put(j,"暗");
                        System.out.println(j+"set :"+hashMap.get(j));
                        continue;
                    }
                    if (hashMap.get(j).equals("暗")){
                        hashMap.put(j,"亮");
                        System.out.println(j+"set :"+hashMap.get(j));
                    }
                }
            }
        }
        //输出最后结果
        for (int i=1;i<=100;i++){
            System.out.println(i+"__"+hashMap.get(i));
        }


    }

_____________num:1__________________
1set :暗
2set :暗
3set :暗
4set :暗
5set :暗
6set :暗
7set :暗
8set :暗
9set :暗
10set :暗
11set :暗
12set :暗
13set :暗
14set :暗
15set :暗
16set :暗
17set :暗
18set :暗
19set :暗
20set :暗
21set :暗
22set :暗
23set :暗
24set :暗
25set :暗
26set :暗
27set :暗
28set :暗
29set :暗
30set :暗
31set :暗
32set :暗
33set :暗
34set :暗
35set :暗
36set :暗
37set :暗
38set :暗
39set :暗
40set :暗
41set :暗
42set :暗
43set :暗
44set :暗
45set :暗
46set :暗
47set :暗
48set :暗
49set :暗
50set :暗
51set :暗
52set :暗
53set :暗
54set :暗
55set :暗
56set :暗
57set :暗
58set :暗
59set :暗
60set :暗
61set :暗
62set :暗
63set :暗
64set :暗
65set :暗
66set :暗
67set :暗
68set :暗
69set :暗
70set :暗
71set :暗
72set :暗
73set :暗
74set :暗
75set :暗
76set :暗
77set :暗
78set :暗
79set :暗
80set :暗
81set :暗
82set :暗
83set :暗
84set :暗
85set :暗
86set :暗
87set :暗
88set :暗
89set :暗
90set :暗
91set :暗
92set :暗
93set :暗
94set :暗
95set :暗
96set :暗
97set :暗
98set :暗
99set :暗
100set :暗
_____________num:2__________________
2set :亮
4set :亮
6set :亮
8set :亮
10set :亮
12set :亮
14set :亮
16set :亮
18set :亮
20set :亮
22set :亮
24set :亮
26set :亮
28set :亮
30set :亮
32set :亮
34set :亮
36set :亮
38set :亮
40set :亮
42set :亮
44set :亮
46set :亮
48set :亮
50set :亮
52set :亮
54set :亮
56set :亮
58set :亮
60set :亮
62set :亮
64set :亮
66set :亮
68set :亮
70set :亮
72set :亮
74set :亮
76set :亮
78set :亮
80set :亮
82set :亮
84set :亮
86set :亮
88set :亮
90set :亮
92set :亮
94set :亮
96set :亮
98set :亮
100set :亮
_____________num:3__________________
3set :亮
6set :暗
9set :亮
12set :暗
15set :亮
18set :暗
21set :亮
24set :暗
27set :亮
30set :暗
33set :亮
36set :暗
39set :亮
42set :暗
45set :亮
48set :暗
51set :亮
54set :暗
57set :亮
60set :暗
63set :亮
66set :暗
69set :亮
72set :暗
75set :亮
78set :暗
81set :亮
84set :暗
87set :亮
90set :暗
93set :亮
96set :暗
99set :亮
_____________num:4__________________
4set :暗
8set :暗
12set :亮
16set :暗
20set :暗
24set :亮
28set :暗
32set :暗
36set :亮
40set :暗
44set :暗
48set :亮
52set :暗
56set :暗
60set :亮
64set :暗
68set :暗
72set :亮
76set :暗
80set :暗
84set :亮
88set :暗
92set :暗
96set :亮
100set :暗
_____________num:5__________________
5set :亮
10set :暗
15set :暗
20set :亮
25set :亮
30set :亮
35set :亮
40set :亮
45set :暗
50set :暗
55set :亮
60set :暗
65set :亮
70set :暗
75set :暗
80set :亮
85set :亮
90set :亮
95set :亮
100set :亮
_____________num:6__________________
6set :亮
12set :暗
18set :亮
24set :暗
30set :暗
36set :暗
42set :亮
48set :暗
54set :亮
60set :亮
66set :亮
72set :暗
78set :亮
84set :暗
90set :暗
96set :暗
_____________num:7__________________
7set :亮
14set :暗
21set :暗
28set :亮
35set :暗
42set :暗
49set :亮
56set :亮
63set :暗
70set :亮
77set :亮
84set :亮
91set :亮
98set :暗
_____________num:8__________________
8set :亮
16set :亮
24set :亮
32set :亮
40set :暗
48set :亮
56set :暗
64set :亮
72set :亮
80set :暗
88set :亮
96set :亮
_____________num:9__________________
9set :暗
18set :暗
27set :暗
36set :亮
45set :亮
54set :暗
63set :亮
72set :暗
81set :暗
90set :亮
99set :暗
_____________num:10__________________
10set :亮
20set :暗
30set :亮
40set :亮
50set :亮
60set :暗
70set :暗
80set :亮
90set :暗
100set :暗
_____________num:11__________________
11set :亮
22set :暗
33set :暗
44set :亮
55set :暗
66set :暗
77set :暗
88set :暗
99set :亮
_____________num:12__________________
12set :亮
24set :暗
36set :暗
48set :暗
60set :亮
72set :亮
84set :暗
96set :暗
_____________num:13__________________
13set :亮
26set :暗
39set :暗
52set :亮
65set :暗
78set :暗
91set :暗
_____________num:14__________________
14set :亮
28set :暗
42set :亮
56set :亮
70set :亮
84set :亮
98set :亮
_____________num:15__________________
15set :亮
30set :暗
45set :暗
60set :暗
75set :亮
90set :亮
_____________num:16__________________
16set :暗
32set :暗
48set :亮
64set :暗
80set :暗
96set :亮
_____________num:17__________________
17set :亮
34set :暗
51set :暗
68set :亮
85set :暗
_____________num:18__________________
18set :亮
36set :亮
54set :亮
72set :暗
90set :暗
_____________num:19__________________
19set :亮
38set :暗
57set :暗
76set :亮
95set :暗
_____________num:20__________________
20set :亮
40set :暗
60set :亮
80set :亮
100set :亮
_____________num:21__________________
21set :亮
42set :暗
63set :暗
84set :暗
_____________num:22__________________
22set :亮
44set :暗
66set :亮
88set :亮
_____________num:23__________________
23set :亮
46set :暗
69set :暗
92set :亮
_____________num:24__________________
24set :亮
48set :暗
72set :亮
96set :暗
_____________num:25__________________
25set :暗
50set :暗
75set :暗
100set :暗
_____________num:26__________________
26set :亮
52set :暗
78set :亮
_____________num:27__________________
27set :亮
54set :暗
81set :亮
_____________num:28__________________
28set :亮
56set :暗
84set :亮
_____________num:29__________________
29set :亮
58set :暗
87set :暗
_____________num:30__________________
30set :亮
60set :暗
90set :亮
_____________num:31__________________
31set :亮
62set :暗
93set :暗
_____________num:32__________________
32set :亮
64set :亮
96set :亮
_____________num:33__________________
33set :亮
66set :暗
99set :暗
_____________num:34__________________
34set :亮
68set :暗
_____________num:35__________________
35set :亮
70set :暗
_____________num:36__________________
36set :暗
72set :暗
_____________num:37__________________
37set :亮
74set :暗
_____________num:38__________________
38set :亮
76set :暗
_____________num:39__________________
39set :亮
78set :暗
_____________num:40__________________
40set :亮
80set :暗
_____________num:41__________________
41set :亮
82set :暗
_____________num:42__________________
42set :亮
84set :暗
_____________num:43__________________
43set :亮
86set :暗
_____________num:44__________________
44set :亮
88set :暗
_____________num:45__________________
45set :亮
90set :暗
_____________num:46__________________
46set :亮
92set :暗
_____________num:47__________________
47set :亮
94set :暗
_____________num:48__________________
48set :亮
96set :暗
_____________num:49__________________
49set :暗
98set :暗
_____________num:50__________________
50set :亮
100set :亮
_____________num:51__________________
51set :亮
_____________num:52__________________
52set :亮
_____________num:53__________________
53set :亮
_____________num:54__________________
54set :亮
_____________num:55__________________
55set :亮
_____________num:56__________________
56set :亮
_____________num:57__________________
57set :亮
_____________num:58__________________
58set :亮
_____________num:59__________________
59set :亮
_____________num:60__________________
60set :亮
_____________num:61__________________
61set :亮
_____________num:62__________________
62set :亮
_____________num:63__________________
63set :亮
_____________num:64__________________
64set :暗
_____________num:65__________________
65set :亮
_____________num:66__________________
66set :亮
_____________num:67__________________
67set :亮
_____________num:68__________________
68set :亮
_____________num:69__________________
69set :亮
_____________num:70__________________
70set :亮
_____________num:71__________________
71set :亮
_____________num:72__________________
72set :亮
_____________num:73__________________
73set :亮
_____________num:74__________________
74set :亮
_____________num:75__________________
75set :亮
_____________num:76__________________
76set :亮
_____________num:77__________________
77set :亮
_____________num:78__________________
78set :亮
_____________num:79__________________
79set :亮
_____________num:80__________________
80set :亮
_____________num:81__________________
81set :暗
_____________num:82__________________
82set :亮
_____________num:83__________________
83set :亮
_____________num:84__________________
84set :亮
_____________num:85__________________
85set :亮
_____________num:86__________________
86set :亮
_____________num:87__________________
87set :亮
_____________num:88__________________
88set :亮
_____________num:89__________________
89set :亮
_____________num:90__________________
90set :亮
_____________num:91__________________
91set :亮
_____________num:92__________________
92set :亮
_____________num:93__________________
93set :亮
_____________num:94__________________
94set :亮
_____________num:95__________________
95set :亮
_____________num:96__________________
96set :亮
_____________num:97__________________
97set :亮
_____________num:98__________________
98set :亮
_____________num:99__________________
99set :亮
_____________num:100__________________
100set :暗
1__暗
2__亮
3__亮
4__暗
5__亮
6__亮
7__亮
8__亮
9__暗
10__亮
11__亮
12__亮
13__亮
14__亮
15__亮
16__暗
17__亮
18__亮
19__亮
20__亮
21__亮
22__亮
23__亮
24__亮
25__暗
26__亮
27__亮
28__亮
29__亮
30__亮
31__亮
32__亮
33__亮
34__亮
35__亮
36__暗
37__亮
38__亮
39__亮
40__亮
41__亮
42__亮
43__亮
44__亮
45__亮
46__亮
47__亮
48__亮
49__暗
50__亮
51__亮
52__亮
53__亮
54__亮
55__亮
56__亮
57__亮
58__亮
59__亮
60__亮
61__亮
62__亮
63__亮
64__暗
65__亮
66__亮
67__亮
68__亮
69__亮
70__亮
71__亮
72__亮
73__亮
74__亮
75__亮
76__亮
77__亮
78__亮
79__亮
80__亮
81__暗
82__亮
83__亮
84__亮
85__亮
86__亮
87__亮
88__亮
89__亮
90__亮
91__亮
92__亮
93__亮
94__亮
95__亮
96__亮
97__亮
98__亮
99__亮
100__暗

跑出来的结果是,1,4,9,25,36,49,64,81,100是暗的。那么它们必定被操作了奇数次。


稍微观察一下,也能看到这些数字有一个很显然的特点:都是完全平方数。

为什么会这样呢?

  • 回到原来,每个编号的灯被操作的次数,等于它在1~100中拥有的因数个数。
  • 那么就会得出一个结论,完全平方数有奇数个约数。
//为什么完全平方数有奇数个约数?
以100为例:
1×100=100
2*50=100
4*25=100
5*20=100
10*10=100
/*
100的所有约数如上所示,
显然在10×10=100之前,两个乘数都是100的约数,是偶数个
,但10只能算一个,所以完全平方数必定有奇数个约数,
对应的,非完全平方数一定有偶数个约数。
*/

数学结论:

完全平方数必定有奇数个约数,
非完全平方数一定有偶数个约数。

那么最开始的问题,就变成了找完全平方数的问题,一下子跳过了所有的逻辑和步骤,是完全超越了运算效率,直达结果的进步。这是一个显然的,数学水平影响编程效率的实例。

这个结论可以有很多拓展,以后一旦遇到存在编号,并且与奇数和偶数相关的都可以进行大幅度的简化和跳跃,是对编程效率的巨大提升。

posted @ 2019-06-03 17:16  thinfog  阅读(3879)  评论(0编辑  收藏  举报