我的朋友给了我一个谜语。事情是这样的:
有100个人。他们中的每一个人依次做以下工作: 第一个人打开所有的盒子。第二个人将状态改为所有的盒子,它们的数目除以2,没有剩余数。例如,如果一个盒子是打开的,它的数目除以2,那么它就关闭了。一个封闭的盒子也是如此。 第三人将州改为所有的盒子,其数字除以3,没有剩余。“我”的人把国家变成所有的盒子,其数字被我除以,没有残余物。 现在,在处理结束时,我需要显示打开的所有框(它们的编号)。
我试图实现一个解决方案,但我认为它没有效率。下面是:
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;
}
}
}发布于 2014-12-09 19:00:26
它有非常简单的解决方案。
将打开的盒子将是它们所在位置为一个数字的平方幂的所有盒子。
例如,在你的问题中,它在1-100之间,所以答案是:
1 4 9 16 25 36 49 64 81 100
而且我的解决方案比你的快,因为它的顺序是θ(√n)
发布于 2014-12-09 17:50:22
遍历所有框并按当前索引进行调整。执行开关设置框打开或关闭,这取决于它的前一个状态。然后,在您完成100循环之后,在100个框中执行一个辅助循环,查看哪些框打开并打印出来。
发布于 2014-12-09 18:11:24
下面是我在评论中描述的一个快速实现:
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开始)
https://stackoverflow.com/questions/27385418
复制相似问题