Java中的谜语 - Java

时间:2014-12-09 17:47:17

标签: java arrays algorithm

我的朋友给了我一个解决的谜语。它是这样的:

  

有100个人。反过来,他们每个人都做了以下事情:

     

第一个人打开所有的盒子。第二个人改变了   状态到所有数字除以2的方框,没有   余。例如,如果一个盒子打开并且它的数量是分开的   截止2,它已关闭。封闭的盒子也是如此。

     

第三个人将状态更改为编号为的所有框   除以3,没有剩余。 "我"人改变了状态   所有数字除以i的方框,没有余数。

     

现在,在这个过程的最后,我需要显示所有的框(他们的   数字)谁是开放的。

我试图实施一个解决方案,但我认为它效率不高。这是:

public class BoxesExc {

    public static void main(String[] args) {
        Box[] boxes = new Box[100];
        // Inflating the array with boxes
        for(int i=0; i<boxes.length; i++) {
            boxes[i] = new Box(i, false);
        }

        // Main part:
        for(int i=1; i<=boxes.length; i++) {
            for(int j=1; j<=i; j++) {
                // If the number is even
                if(i%2 == 0) {
                    if(j%i == 0) {
                        boxes[j].setOpen(!boxes[j].isOpen);
                    }
                } 
                // If the number is odd
                else {
                    if(j%2 != 0) {
                        if(j%i == 0) {
                            boxes[j].setOpen(!boxes[j].isOpen);
                        }
                    }
                }
            }
        }

    //Displaying the opened boxes:
    for(Box box : boxes) {
        if(box.isOpen)
            System.out.println(box.getNum()+",");
    }
    }

    public static class Box {
        private int num;
        private boolean isOpen;

        public Box(int num, boolean isOpen) {
            this.isOpen = isOpen;
        }

        public int getNum() {
            return num;
        }

        public boolean isOpen() {
            return isOpen;
        }

        public void setOpen(boolean isOpen) {
            this.isOpen = isOpen;
        }

    }
}

我还没试过,但我只是看着它,看起来很糟糕。 我需要你帮助的人找到更好的解决方案。

编辑:好吧,我设法解决了这个问题。这是解决方案:

public class BoxesExc {

    public static void main(String[] args) {
        int[] boxes = new int[101];
        // Inflating the array with boxes
        for(int i=1; i<boxes.length; i++) {
            boxes[i] = i;
        }

        int counter = 0;
        for(int i=1; i<boxes.length; i++) {
            for(int j=1; j<=i; j++) {
                if(i%j == 0)
                    counter++;
            }
            if(counter%2 != 0)
                System.out.print(""+i+", ");
            counter = 0;
        }
    }
}

4 个答案:

答案 0 :(得分:2)

它有非常简单的解决方案

  

将要打开的方框将是所有的方框,它们是一个数字的方数取幂。

例如在你的问题中它在1-100之间,所以答案将是:

  

1 4 9 16 25 36 49 64 81 100

我的解决方案也比你的快,因为它的顺序是θ(√n)

答案 1 :(得分:0)

遍历所有框并按当前索引进行调整。根据它的先前状态,进行开关以打开或关闭盒子。然后你完成了100循环;在100个方框中进行二次循环,看看哪些是打开的并打印出来。

答案 2 :(得分:0)

以下是我在评论中描述的内容的快速实现:

public class BoxesExc {

    public static void main(String[] args) {
        Box[] boxes = new Box[100];
        // Inflating the array with boxes
        for(int i=0; i<boxes.length; i++) {
            boxes[i] = new Box(i, false);
        }

        // Main part:
        for (int i=1; i < boxes.length; i++) {
            // j+=i goes 3,6,9... for i = 3
            for (int j = i; j < boxes.length; j+=i) {
                 boxes[j].setOpen(!boxes[j].isOpen);
            }
        }

        //Displaying the opened boxes:
        for(Box box : boxes) {
            if(box.isOpen)
                System.out.println(box.getNum()+",");
        }
    }
}

Nota:您可以将框状态初始化为open并跳过第一次迭代(以i = 2开头)

答案 3 :(得分:0)

由于您只需要打印数字,我认为以下就足够了:

public class BoxesExc {
    public static void main(String[] args) {
        int boxNum = 100;
        for(int i = 1; i*i <= boxNum; i++) {
            System.out.print(i*i+",");
        }
    }
}