如何在java中打印领结?

dwbf0jvd  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(296)

如果输入n=5输出,如何制作此图案:


* *
****
******
****
* *

这是我的密码

for(int i = 0; i < n + 1; i++) {
        for(int j = 0; j < n + 1; j++) {
            if ((j > i && j < n - i) || (j > (n-i) && j < i && i > n))
                System.out.print(" ");
            else
                System.out.print("*");
        }
        System.out.println();
    }

结果如下:


* *
****
******
******
******
******

我怎样才能解决这个问题?

yiytaume

yiytaume1#

你用过或 || 合并“”的上下指向三角形和“”的下上指向三角形。好主意。
你把上面的三角形描述为 (j > i && j < n - i) ,这是正确的。
但是,您将下面的三角形描述为 (j > (n-i) && j < i && i > n) .
这就是问题所在。这个 i > n 对我来说永远不是真的 i 从0到 n 就像你的外环构造一样。为了描述模式的下半部分,应该使用 i>n/2 . 但是,您可以完全删除条件的这一部分,因为第一部分中的计数器比较只适用于下半部分。
所以呢 (j > (n-i) && j < i) .
这让你:


* *
****
******
******
****

顺便说一句, n 线,不是 n+1 外环中的线。
如您所见,“”的下三角形太小了。两边,右边和左边。
所以你需要让你的条件更宽松,也就是说“较低的平等”和“较高的平等”,而不是“较低的”和“较高的”。在代码中 (j >= (n-i) && j <= i) .
把它放在一起:

public class Main {
    static final int n = 5;

    public static void main(String[] args)
    {
        for(int i = 0; i < n; i++) // only n lines
        {
            for(int j = 0; j < n+1; j++) {
                if ((j > i && j < n - i) ||
                    (j >= (n-i) && j <= i)) // more generous and no second condition
                    System.out.print(" ");
                else
                    System.out.print("*");
            }
            System.out.println();
        }
    }
}

这段代码与您的尝试非常相似,可以获得所需的


* *
****
******
****
* *
wa7juj8i

wa7juj8i2#

通过将公共代码放在如下所示的方法中,可以大大简化它:

public class Main {
    static final int LINES = 5;

    public static void main(String[] args) {
        // Upper half
        for (int line = 1; line <= LINES / 2 + 1; line++) {
            print(line);
        }

        // Lower half
        for (int line = LINES / 2; line >= 1; line--) {
            print(line);
        }
    }

    static void print(int line) {
        for (int j = 1; j <= line; j++) {
            System.out.print("*");
        }
        for (int j = 1; j <= LINES - 2 * line + 1; j++) {
            System.out.print(" ");
        }
        for (int j = 1; j <= line; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
}

输出:


* *
****
******
****
* *
mftmpeh8

mftmpeh83#

您现有的尝试实际上非常接近这里是一个工作版本,它修复了第二个条件(您当前的尝试总是错误的):

class Main {
    public static void main(String[] args) {
        printBowtie(5);
    }

    private static void printBowtie(int n) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n + 1; j++) {
                if ((j > i && j < n - i) || (j >= n - i && j <= i)) {
                    System.out.print(" ");
                } else {
                    System.out.print("*");
                }
            }
            System.out.println();
        }
    }
}

输出:


* *
****
******
****
* *

相关差异:

private static void printBowtie(int n) {
-        for (int i = 0; i < n + 1; i++) {
+        for (int i = 0; i < n; i++) {
             for (int j = 0; j < n + 1; j++) {
-                if ((j > i && j < n - i) || (j > (n - i) && j < i && i > n)) {
+                if ((j > i && j < n - i) || (j >= n - i && j <= i)) {

相关问题