N盏灯排成一排,从1到N按顺序依次编号。 有N个人也从1到N依次编号。 第一个人(1号)将灯全部关闭。第二个人(2号)将凡是2和2的倍数的灯 全部做相反处理 第3个人(3号)也是将3个3的倍数的灯座相反处理,后面的人和2号3号一样 吧自己和自己倍数的灯做相反处理 问当第N个人的时候 哪几盏灯是亮的。 
public class light {
public static void main(String args[]){
boolean[][] a = new boolean [10][10];
for(int i = 0 ; i<a.length; i++){
for(int j = 0 ; j<a[i].length ; j++){
if(i == 1){
a[i][j]=false;
}
if(j%2 == 0){
if(a[i][j]==true){
a[i][j] = false;
}else if(a[i][j]==false){
a[i][j] = true;
}
}
}
}
for(int i = 0 ; i <a.length ;i++){
for(int j =0 ; j<a[i].length ; j++){
if(a[i][j] == true)
System.out.println(i+"+"+j);

}

}
}java

解决方案 »

  1.   

    这思路是不是对的啊!~
    public class light {
    public static void main(String args[]){
    boolean[][] a = new boolean [10][10];
    for(int i = 0 ; i<a.length; i++){
    for(int j = 0 ; j<a[i].length ; j++){
    if(i == 1){
    a[i][j]=false;
    }
    if(j==i || (j+1)%(i+1) == 0){
    if(a[i][j]==true){
    a[i][j] = false;
    }else if(a[i][j]==false){
    a[i][j] = true;
    }
    }
    }
    }
    for(int i = 0 ; i <a.length ;i++){
    for(int j =0 ; j<a[i].length ; j++){
    if(a[i][j] == true)
    System.out.println(i+"+"+j);

    }

    }
    }
      

  2.   

    貌似没必要建二维数组..public class Test {
    public static void main(String[] args) {
    boolean[] b = new boolean[11];

    for(int i=0; i<b.length; i++) {
    b[i] = false;
    } for(int i=2; i<b.length; i++) {
    int sign = i;
    for(int j=2; j<b.length; j++) {
    if(j % sign == 0) {
    if(b[j] == true) 
    b[j] = false;
    else b[j] = true;
    }
    }
    }

    for(int i=1; i<b.length; i++) {
    System.out.print(b[i] + " ");
    }
    }
    }
      

  3.   

    public static String getOpenLight(int num) {
    boolean[] lights=new boolean[num];
    System.out.println(Arrays.toString(lights));
    for (int i = 2; i < num+1; i++) {
    System.out.println("第"+(i)+"个人");
    for (int j = 1; j < num+1; j++) {
                                   //灯=0和人=1和=0时候就有错了,我随便这样处理了一下
    if (j %i == 0) {
    if(lights[j-1])
    lights[j-1]=false;
    else
    lights[j-1]=true;
    }
    }
    System.out.println(Arrays.toString(lights));
    }
    return null;
    }
      

  4.   

    import java.util.Arrays;public class Hello {
        public static void main(String[] args) {
            boolean[] lightStates = new boolean[100]; // 99个灯,为了方便,第一个元素不使用.
            Arrays.fill(lightStates, true);        int n = 10; // 10个人
            for (int i = 1; i < n; ++i) {
                for (int l = 1; l < lightStates.length; ++l) {
                    if (l % i == 0) {
                        lightStates[l] = !lightStates[l];
                    }
                }
            }        for (int i = 1; i < lightStates.length; ++i) {
                if (lightStates[i]) {
                    System.out.println("Light " + i + " is on " + lightStates[i]);
                }
            }
        }
    }
      

  5.   

    一维boolean数组 里面刚开始全部存true
    然后遍历这个数组,再每次对里面的值进行修改就行了。
    public static void main(String[] args) {
    //初始化的时候所有都是false表示等都灭着;
    Boolean lightStates []=new Boolean[100];
    for(int i=0;i<lightStates.length;i++){
    for(int j=0;j<lightStates.length;j++){
    if((j+1)%(i+1)==0){
    if(lightStates[j])
    lightStates[j]=false;
    else
    lightStates[j]=true;
    }
    }
    }
    //打印最后的状态
    System.out.println(lightStates);

    }
      

  6.   

    可以这么看,对于第i盏灯,如果从第1个人到第i个人中有偶数个人拉过开关了,则它是亮着的。如果有奇数个人拉过开关的,则它是暗的。
    譬如说,第1盏灯,只有第1个人会拉,所以最后一定是暗的。而第2盏灯,由于有第1个人和第2个人来拉,所以最后一定是亮的。
    还可以继续推导出第3盏扥最后是亮的,第4盏灯最后是暗的,第5盏灯最后是亮的等等。
    写成式子就是:
    找出从1~i找i的可整除的不同因子数(包括1和i在内)。如果因子数为偶数,则i是亮着的;如果是奇数,则i是暗的。
    可是怎么可能是奇数呢?如果k是i的一个因子,则i/k也必定是i的一个因子。那么应该因子数是偶数才对。
    所以因子数为奇数当且仅当i是完全平方数
    所以代码类似
    boolean[] lightstate = new boolean[N];
    for (int i=0; i<N; i++) {
      lightstate[i]=true;
    }
    double s = math.Sqrt(N);for (int i=0; i<s; i++) {
      lightstate[i]= false;
    }//打印输出
    for (int i=0; i<N; i++) {
      if (lightstate[i]) {
        system.out.println("第"+Integer.parseInt(i+1)+"号灯是亮着的")
      } else {
        system.out.println("第"+Integer.parseInt(i+1)+"号灯是暗的")
      }

    这样程序时间复杂度为O(N),比2次循环要少。
      

  7.   

    式子写错了,应当是
    double s = math.Sqrt(N);
     
    for (int i=0; i<s; i++) {
       lightstate[i*i]= false;
     }
      

  8.   

    刚才那个没有验证,验证完以后的如下:public class TestFormet {
    public static void main(String[] args) {
    //初始化的时候所有都是false表示等都灭着;
    Boolean lightStates []=new Boolean[100];
    Arrays.fill(lightStates, true);
    for(int i=0;i<lightStates.length;i++){
    for(int j=0;j<lightStates.length;j++){
    if((j+1)%(i+1)==0){
    if(lightStates[j])
    lightStates[j]=false;
    else
    lightStates[j]=true;
    }
    }
    }
    //打印最后的状态
    for(int i=0;i<lightStates.length;i++){
    System.out.print(lightStates[i]+",");
    }

    }
    }
      

  9.   

    上面的代码还是有问题,应当是lightstate[i*i-1]=false (忘记了数组下标是从0开始的,晕~)
    还可以再榨出一点油水来,那个求方根的可以省略
    int i=1;
    int j=i*i;
    while (j<=N) {
      lightstage[j-1]= false;
    }
    这样就可以了
      

  10.   


    class  ArrTest
    {
    public static void main(String[] args) 
    {
    boolean[] temp = new boolean[10];
    int y = 0;
    //x代表人数,y代表灯数
    for(int x = 1 ;x <= temp.length ;x++)
    {
    for(y = x;y <= temp.length; y++)
    {
    if(x == 0)
    {
    temp[x-1] = true;
    }
    if(y%x == 0)
    {
    if(temp[y-1] == false)
    {
    temp[y-1] = true;
    }
    else
    {
    temp[y-1] = false;
    }
    }
    }
    }
    for(int x = 0;x<temp.length;x++)
    {
    System.out.print(temp[x] + "\t");
    }
    }
    }