我的朋友给了我一个解决的谜语。它是这样的:
有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;
}
}
}
答案 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+",");
}
}
}