首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java - Java的谜语

java - Java的谜语
EN

Stack Overflow用户
提问于 2014-12-09 17:47:16
回答 4查看 1.5K关注 0票数 2

我的朋友给了我一个谜语。事情是这样的:

有100个人。他们中的每一个人依次做以下工作: 第一个人打开所有的盒子。第二个人将状态改为所有的盒子,它们的数目除以2,没有剩余数。例如,如果一个盒子是打开的,它的数目除以2,那么它就关闭了。一个封闭的盒子也是如此。 第三人将州改为所有的盒子,其数字除以3,没有剩余。“我”的人把国家变成所有的盒子,其数字被我除以,没有残余物。 现在,在处理结束时,我需要显示打开的所有框(它们的编号)。

我试图实现一个解决方案,但我认为它没有效率。下面是:

代码语言:javascript
复制
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;
        }

    }
}

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

编辑:好的,伙计们,我设法解决了这个问题。以下是解决办法:

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 4

Stack Overflow用户

发布于 2014-12-09 19:00:26

它有非常简单的解决方案。

将打开的盒子将是它们所在位置为一个数字的平方幂的所有盒子。

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

1 4 9 16 25 36 49 64 81 100

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

票数 2
EN

Stack Overflow用户

发布于 2014-12-09 17:50:22

遍历所有框并按当前索引进行调整。执行开关设置框打开或关闭,这取决于它的前一个状态。然后,在您完成100循环之后,在100个框中执行一个辅助循环,查看哪些框打开并打印出来。

票数 0
EN

Stack Overflow用户

发布于 2014-12-09 18:11:24

下面是我在评论中描述的一个快速实现:

代码语言:javascript
复制
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开始)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27385418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档