问题描述
有100盏灯,编号为1到100,分别对应100个控制开关。开始全部朝上(朝上表示开,朝下表示关),然后进行以下操作:编号为1的倍数的反方向拨开关,编号为2的倍数的反方向拨开关......编号为100的反方向拨开关,问最后状态为关的灯的编号。
public class Test2_7_1 {
static void judge()
{
int[] a=new int[101];
for (int i=1;i<=100;i++)
a[i]=1;
for (int i=1;i<=100;i++)
for (int j=i;j<=100;j+=i)
a[j] = -a[j]; //改变灯的状态
for (int i=1;i<=100;i++)
if (a[i]==-1)
System.out.println(i+"号灯是关的");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
judge();
}
}
优化后
优化说明:若灯进行了偶数次的拨开关,那它还保持最开始的开关状态,若进行奇数次的拨开关,则它的最终状态和开始状态相反。已知:如果一个数是完全平方数,那么它有奇数个因子,否则,有偶数个因子。
public class Test2_7_2 {
static void judge()
{
for (int i=1;i<=100;i++)
{
int j=(int) Math.sqrt(i);
if (i==j*j) //判断i是否为完全平方数
System.out.println(i+"号灯是关的");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
judge();
}
}
再优化
public class Test2_7_3 {
static void judge()
{
for (int i=1;i<=(int) Math.sqrt(100);i++)
System.out.println(i*i+"号灯是关的");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
judge();
}
}