【问题标题】:TRIANGLE ALGORITHM [closed]三角算法[关闭]
【发布时间】:2020-05-09 21:59:13
【问题描述】:

1

2 3

4 5 4

3 2 1 2

3 4 5 4 3

我想做一个这样的三角形。我尝试制作三角形和数字,但数字不适合三角形,因此输出与预期不符。请帮忙。

示例输入:n = 5;

1) 这是制作三角形的代码。

int k = 1;
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (j <= i) {
                    System.out.print("* ");
                } else {
                    System.out.print("  ");
                }
            }
            System.out.println();
        }

2) 这是生成数字的代码。

int k = 1;
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i % 2 == 0) {
                    if (k == 5) {
                        break;
                    }
                    System.out.print(k + " ");
                    k++;
                } else if (i % 2 != 0) {
                    if (k == 1) {
                        break;
                    }
                    System.out.print(k + " ");
                    k--;
                }
            }
        }

【问题讨论】:

  • 代替打印*,您可以创建一个按顺序返回数字的方法 1 2 3 4 5 4 3 2 1 2 3 ... 。因此,在创建此类方法后,只需将 System.out.print("* "); 更改为 System.out.print(generator.getNumber() + " ");
  • @Pshemo 你能告诉我代码吗?我仍然不明白如何将数字和三角形结合起来。

标签: java algorithm logic


【解决方案1】:

我们需要打印多行,每行打印的值与行号相同。如果我们打印*'s,那就很容易了:

static void printTriangle(int rowCount) {
    for (int row = 1; row <= rowCount; row++) {
        for (int i = 0; i < row; i++)
            System.out.print("* ");
        System.out.println();
    }
}

printTriangle(5)

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

我们希望值来自1 2 3 4 5 4 3 2 ... 的重复序列,而不是打印*

序列长 8,所以如果我们从 0 开始取一个不断增加的数 a,并在除以 8 时计算余数,即 b = a % 8,我们得到一个重复序列 0 1 2 3 4 5 6 7 ...。如果我们然后计算与4 的距离,使用c = Math.abs(4 - b),我们得到4 3 2 1 0 1 2 3 ...。如果我们从5 中减去它,即d = 5 - c,我们得到1 2 3 4 5 4 3 2 ...,即所需的序列。

static void printTriangle(int rowCount) {
    int a = 0;
    for (int row = 1; row <= rowCount; row++) {
        for (int i = 0; i < row; i++) {
            int b = a % 8;
            int c = Math.abs(4 - b);
            int d = 5 - c;
            System.out.print(d + " ");
            a++;
        }
        System.out.println();
    }
}

代码可以简化为:

static void printTriangle(int rowCount) {
    for (int seq = 0, row = 1; row <= rowCount; row++) {
        for (int i = 0; i < row; i++, seq++)
            System.out.print((5 - Math.abs(4 - seq % 8)) + " ");
        System.out.println();
    }
}

printTriangle(10)

1 
2 3 
4 5 4 
3 2 1 2 
3 4 5 4 3 
2 1 2 3 4 5 
4 3 2 1 2 3 4 
5 4 3 2 1 2 3 4 
5 4 3 2 1 2 3 4 5 
4 3 2 1 2 3 4 5 4 3 

对于高级版本,我们也可以将打印的最大值设为动态:

static void printTriangle(int rowCount, int maxValue) {
    String fmt = "%" + String.valueOf(maxValue).length() + "s ";
    for (int row = 1, seq = 0; row <= rowCount; row++) {
        for (int i = 0; i < row; i++, seq++)
            System.out.printf(fmt, (maxValue - Math.abs(maxValue - 1 - seq % (maxValue * 2 - 2))));
        System.out.println();
    }
}

printTriangle(5, 5)

1 
2 3 
4 5 4 
3 2 1 2 
3 4 5 4 3 

printTriangle(20, 14)

 1 
 2  3 
 4  5  6 
 7  8  9 10 
11 12 13 14 13 
12 11 10  9  8  7 
 6  5  4  3  2  1  2 
 3  4  5  6  7  8  9 10 
11 12 13 14 13 12 11 10  9 
 8  7  6  5  4  3  2  1  2  3 
 4  5  6  7  8  9 10 11 12 13 14 
13 12 11 10  9  8  7  6  5  4  3  2 
 1  2  3  4  5  6  7  8  9 10 11 12 13 
14 13 12 11 10  9  8  7  6  5  4  3  2  1 
 2  3  4  5  6  7  8  9 10 11 12 13 14 13 12 
11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6 
 7  8  9 10 11 12 13 14 13 12 11 10  9  8  7  6  5 
 4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 13 14 13 
12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8 
 9 10 11 12 13 14 13 12 11 10  9  8  7  6  5  4  3  2  1  2 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2011-03-09
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    相关资源
    最近更新 更多