【问题标题】:Need help adjusting a diamond shape in Java需要帮助在 Java 中调整菱形
【发布时间】:2015-11-05 05:33:27
【问题描述】:

我写了一些会打印钻石的代码

static void printDiamond(int size) {
    for (int i = 0; i < size; i++) {
        for (int a = 0; a < (size - (i + 1)); a++) {
            System.out.print(" ");
        }
        System.out.print("X");
        for (int b = 0; b < (i * 2); b++) {
            System.out.print(" ");
        }
        System.out.print("X");
        System.out.println();
    }

    for (int i = size-1; i >= 0; i--) {
        for (int a = 0; a < (size - (i + 1)); a++) {
            System.out.print(" ");
        }
        System.out.print("X");
        for (int b = 0; b < (i * 2); b++) {
            System.out.print(" ");
        }
        System.out.print("X");
        System.out.println();
    }
}

我遇到的钻石问题是,无论我输入什么,它都会打印双倍。因此,如果用户为钻石输入 6,它应该如下所示:

  XX
 X  X
X    X
X    X
 X  X
  XX

使用我的代码,如果用户输入 5,它会打印出以下内容:

    XX
   X  X
  X    X
 X      X
X        X
X        X
 X      X
  X    X
   X  X
    XX

它不是打印出 5 行,而是打印出 10。如果我输入 3,它将打印出 6 行而不是 3。似乎对于我的钻石来说,它正在输出它从用户那里收到的数字,但是然后打印出该数量乘以 2。有没有办法我可以将 printDiamond 方法输出的大小减半,使其具有正确的行数?

【问题讨论】:

  • 你应该重新检查你的循环条件——特别是外循环。
  • @mike1319 一点建议。您不需要在问题中包含框代码或输出。问题越简洁越好。
  • @MichaelQuatrani 谢谢你的建议。我编辑了代码的方框部分,所以问题更简洁。

标签: java loops


【解决方案1】:

我能够通过调整循环边界条件来更正您的代码。首先,您打印了高度为size 的钻石的顶部 部分,并且还打印了高度为size 的底部药水,对于2*size的总高度。

另一个大问题是您没有处理奇数输入,因为所有钻石都以偶数高度出现。我也纠正了这个问题。看看下面的代码。

static void printDiamond(int size) {
    for (int i = 0; i < (int)Math.ceil(size/2.0); i++) {
        for (int a = 0; a < (int)Math.ceil(size/2.0) - (i + 1); a++) {
            System.out.print(" ");
        }
        System.out.print("X");
        for (int b = 0; b < (i * 2); b++) {
            System.out.print(" ");
        }
        System.out.print("X");
        System.out.println();
    }

    for (int i = (int)Math.floor(size/2.0)-1; i >= 0; i--) {
        for (int a = 0; a < (int)Math.ceil(size/2.0) - (i + 1); a++) {
            System.out.print(" ");
        }
        System.out.print("X");
        for (int b = 0; b < (i * 2); b++) {
            System.out.print(" ");
        }
        System.out.print("X");
        System.out.println();
    }
}

printDiamond(5);
System.out.print("\n");
printDiamond(6);

输出:

  XX
 X  X
X    X
 X  X
  XX

  XX
 X  X
X    X
X    X
 X  X
  XX

【讨论】:

  • 我刚刚尝试了这段代码,如果我输入一个奇数,它将返回数字 - 1 行。它适用于正数,但在奇数时似乎不起作用。
  • 我不认为他的代码曾经处理过奇数的情况。整个事情都需要重构。
  • @TimBiegeleisen 同意。我正在考虑采用一种完全不同的方法来处理奇怪的情况。这么一说,太爽了!你能解释一下Math.ceil 和Math.floor 在这种情况下是如何工作的吗?
  • Math.ceil() 和 Math.floor() 允许您在 size 为奇数的情况下有条件地跳过菱形的最宽行。在偶数的情况下,您确实希望保留重复的最宽行。
  • @TimBiegeleisen 谢谢你的帮助,我还没有被介绍给 Math.ceil() 或 Math.floor() 所以看到这是一个解决方案非常酷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多