问题描述:
有100盏灯,编号依次为1, 2, 3…100,电灯全部关着。现在来了100个人,第一个人把所有的灯开关按下;第二个人隔一个灯按下(2,4,6…);第三个人每隔两个灯按下(3,6,9…)…第100个人隔99个灯按下(100),最后还有几盏灯,那几盏灯亮着?
代码演示:
package com.yaunsine;
public class TestLamb {
public static void main(String[] args) {
int n = 100;
boolean[] lambs = new boolean[n];
for (int i = 1; i <= n; i++) {
for (int j = 0; j < n; j++) {
if ((j+1) % i == 0) {
lambs[j] = !lambs[j];
}
}
}
int count = 0;
System.out.print("Opened lambert index:");
for (int i = 0; i < n; i++) {
if (lambs[i]) {
System.out.print(" " + (i+1));
count++;
}
}
System.out.println();
System.out.println("Opened lambert count: " + count);
}
}
运行结果:
答案分析:
这道题的考点就是公约数的个数问题,如果一个数的公约数是奇数个,那么灯最后的结果就会是亮的,如果一个数的公约数是偶数个,那么最后灯的状态是关闭的。如果一个数可以化成另一个数的平方,那么这个数通常公约数就是奇数个。例如:
数 | 公约数 | 公约数个数 |
---|---|---|
1 | 1 | 1 |
4 | 1,2,4 | 3 |
9 | 1,3,9 | 3 |
16 | 1,2,4, 8, 16 | 5 |
100 | 1,2, 4, 10, 25, 50, 100 | 7 |
显然,公约数的个数是不是奇数,可以根据它是否可以分解成两个同样的数来决定。
所以记住这个定律:
完全平方数的约数是奇数个
那么我们只需要找到100以内的所有完全平方数,就可以得出答案。
由此,根据1~100以内,找到的完全平方数有:
1, 4, 9, 16, 25, 36, 49, 64, 81, 100
因此可以推断出,个数是10个。