题目:有N 个灯放在一排,从1到N 依次顺序编号。有N 个人也从1 到N 依次编号。1号将灯全部关闭,2将凡是2 的倍数的灯打开;3 号将凡是3的倍数的灯作相反处理(该灯如为打开的, 则将它关闭;如关闭的,则将它打开)。以后的人都和3 号一样,将凡是自己编号倍数的灯作相反处理。试计算第N 个操作后,哪几盏灯是点亮的。(0-表示灯打开1-表示灯关闭)。
分析:题目还是蛮简单的,直接用一个boolean数组来保存灯的状态,初始化后遍历即可。
源代码:
import java.util.Scanner;
public class Main3 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();//读取灯的数目
boolean[] a = new boolean[n+1];
for(int i=1;i<=n;i++){//初始化灯的状态,false表示亮着,true代表关闭
a[i] = false;
}
for(int i=2;i<=n;i++)
for(int j=i;j<=n;j++){
if(j%i==0){
a[j] = light(a[j]);
}
}
for(int i=1;i<=n;i++){
if(a[i] == false){
System.out.print(i+" ");
}
}
}
public static boolean light(boolean l){
if(true == l){
return false;
}else{
return true;
}
}
}
在网上查了下资料,还有如下的思路,但我好像没理解,欢迎大家指点:
以N=200时为例,200以内平方根为正整数的都是这个题就是考察1~200每个数字的因子数的奇偶性.有奇数个因数的灯状态和初始状态相异,反之,因数是偶数个的,灯的状态不变.举两个例子:2号灯有1和2两个因数(2=1*2),所以开关两次,等状态不变;4号灯有1、2、4三个因数,(4=1*4=2*2)按三次,和初始状态不同,即一开始灯是灭着的,按完三次灯就亮了.最后1.4.9.16.25.36.49.64.81.100.121.144.169.196亮着