首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的逻辑中的缺陷- Java

我的逻辑中的缺陷- Java
EN

Stack Overflow用户
提问于 2016-03-10 09:41:26
回答 3查看 118关注 0票数 0

我必须编写一个程序,它使用数组来表示100个学生,无论是打开还是关闭100个储物柜。从学生1开始,每个学生必须改变储物柜的位置(如果关闭,关闭就关闭),如果他们的学生号码是一个因素的储物柜号码。例如,学生3会改变储物柜3,6,9等的位置。

代码语言:javascript
复制
public class LockerFun {
public static void main (String[] args) {
  int[] lockers = new int[101];
  int[] students = new int[101];
  for (int i = 1; i < lockers.length; i++) {
     lockers[i] = 1;
  }
  for (int i = 1; i < students.length; i++) {
     System.out.print( i + " ");
     for (int j = 1; j < lockers.length; j++) {
        if (j % i == 0) {
           lockers[i] *= -1;
        }
     }
  }
  System.out.println();
  for (int i = 1; i < lockers.length; i++) {
     if (lockers[i] == -1) {
        System.out.print( "O ");
     }
     else {
        System.out.print( "X ");
     }
    }
  }
}
// 1 = closed, -1 = open

在某个地方,我的逻辑中有一个缺陷,因为最终的结果应该是每个储物柜号码,也就是一个完美的正方形被打开,其余的被关闭。我哪里出问题了?我的朋友说过要用布尔值来存放储物柜,但我不知道这会如何改变结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-10 10:03:35

你应该注意几件事:

  1. 用于储物柜数组的索引是错误的,主要错误。
  2. 您应该使用布尔值来标记状态,就像您的朋友说的那样;结果是相同的,但是代码会更干净,内存占用也会更小(从101个int值到101个布尔值)。
  3. 您可以使用从0到99的数组,但需要更正用于数组的索引。如果您只使用"0“索引,您可以保留它,就像现在一样,为了便于理解,我保留了您的索引。
  4. 应该对输出使用格式化方法,以便将索引与值对齐。
  5. 您不使用so数组,只使用学生数量,因此您可以从代码中删除它,只引入一个变量或常量,您将节省内存空间(从10个int值到1)。

您的代码更正如下:

代码语言:javascript
复制
public class LockerFun {
    public static void main(String[] args) {
        final int numberOfStudents = 100;
        boolean[] lockers = new boolean[101];

        for (int i = 1; i < lockers.length; i++)
            lockers[i] = true;

        for (int i = 1; i <= numberOfStudents; i++) {
            System.out.print(String.format("%4d", i));
            for (int j = 1; j < lockers.length; j++) {
                if (j % i == 0) {
                    lockers[j] = !lockers[j];
                }
            }
        }

        System.out.println();
        for (int i = 1; i < lockers.length; i++) {
            if (lockers[i])
                System.out.print(String.format("%4s", "X"));
            else
                System.out.print(String.format("%4s", "O"));
        }
    }
}

我希望这对你有帮助。

票数 2
EN

Stack Overflow用户

发布于 2016-03-10 09:46:26

一个错误-在您的内部循环中,您更改了lockers[i]而不是lockers[j]

但是为什么不让内部for循环只包含特定的数字呢,3, 6, 9...?它将使代码更简单。

代码语言:javascript
复制
 for (int j = i; j < lockers.length; j += i) {
     lockers[j] *= -1;
 }
票数 1
EN

Stack Overflow用户

发布于 2016-03-10 09:49:26

在打开和关闭储物柜的方法中:

代码语言:javascript
复制
for (int i = 1; i < students.length; i++) {
    System.out.print( i + " ");
    for (int j = 1; j < lockers.length; j++) {
        if (j % i == 0) {
            lockers[i] *= -1;
        }
    }
}

这一行需要引用储物柜索引,而不是学生,即

代码语言:javascript
复制
lockers[j] *= -1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35912716

复制
相关文章

相似问题

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