【问题标题】:How to construct a pyramid in Java如何在 Java 中构建金字塔
【发布时间】:2020-02-11 17:29:53
【问题描述】:

根据用户输入的行数,如何使用循环程序构建金字塔?比如

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

我尝试观看几个视频并阅读有关此逻辑的文章,但讲师要么无法理解,要么跳过了推理。

我知道每行增加 2 颗星,而且我知道因为每行都有奇数颗星,我可以将一行中的星数定义为 2n+1,其中 n 是整数。我注意到一个 2 行三角形的底数为 3 颗星,一个 3 行三角形的底数为 5 颗星,依此类推。因此,对于第 n 行,三角形底数为 n+(n-1),即 2n-1。例如,r_5:base = 9 颗星。我知道我的程序需要考虑的下一件事是间距。我注意到,从底部开始,间距每行增加 2,直到前半部分有 n-1 个空格,后半部分有 n-1 个空格,换句话说,间距从底部开始增加,直到大于或等于 2b-2。

我认为涵盖 Java 程序需要知道的所有要点:每行的星数、基数的大小和间距。 但是我如何用 for while 循环来翻译这一切呢?

【问题讨论】:

  • 想清楚这一点:for 循环将允许循环体执行 X 次,其中 X 是一个有限且已知的数字。想想在你的金字塔中什么是已知的和有限的数字?您的程序在开始工作之前需要询问用户的一件事是什么?
  • 就像对 OP 的说明一样,您将需要多个循环。请记住,当您知道有多少次迭代时使用 for 循环,而当迭代次数不确定时使用 while 循环。鉴于这些点点滴滴的知识和你以前对代数的理解,按照 Stephen C 所说的去做,试一试。忽略发布的解决方案——有些事情告诉我,你已经知道你会从为答案的挣扎中得到更多。
  • 我自己尝试过编码,但通常我只会得到奇怪的对角星或一列星。自己尝试确实在一定程度上有所帮助,例如,它让我意识到需要多个循环。我很高兴我在这里收到了很多回复,我今天晚些时候醒来时会再试一次

标签: java loops for-loop while-loop shapes


【解决方案1】:

这是我的实现 -

public static String repeat(String str, int times) {
    return new String(new char[times]).replace("\0", str);
}

public void createPyramid(int size) {
    for (int i = 1; i <= size; i += 2) {
        int numSpaces = (size - i) / 2;
        System.out.println(repeat(" ", numSpaces) + repeat("*", i) + repeat(" ", numSpaces));
    }
}

调用方法为 - createPyramid(7); 应该会给你想要的输出。您可以增加更大的金字塔的大小。

我为金字塔的大小迭代的变量。并且每行上的星数从0开始增加2。i增加2。​​空格将等于size - number of *'s但它们必须在*之前和之后对称地重复,我们除它乘以 2。这将给出 * 之前和之后的空格数,在中间我们只需要打印编号由 i 给出的 *。 所以,我们最终打印它们。 repeat 函数创建一个由str 参数重复times 次形成的字符串。例如 - 如果我们调用repeat("abc", 3),它将返回“abcabcabc”。

【讨论】:

    【解决方案2】:

    方法一

    注意,如果我们将当前行号表示为从 0 开始的“行”,总行数表示为“n”,

    每行星数 = 2*line + 1

    每行中的前导(或尾随)空格数 = n - 行 - 1

    我们可以使用这个规则简单地生成金字塔:

    int n = 4;
    for (int line = 0; line < n; line++) {
        StringBuilder sb = new StringBuilder();
        int starsToAppend = 2 * line + 1;
        int spaceToAppend = n - line - 1;
    
        while (spaceToAppend-- > 0) sb.append(" ");
        while (starsToAppend-- > 0) sb.append("*");
    
        System.out.println(sb.toString());
    }
    

    方法二

    您也可以从中间接近并展开。请注意,中间有一个恒定的星号 (*) 列,并且在每一侧,每次仅在每行中添加一个星号。其余的都是空格。

    int n = 4;
    for(int line=0; line <n ; line++){
        StringBuilder sb = new StringBuilder("*");
        int spacesToAppendOnBothSides = n-line-1;
        int starsToAppendOnBothSides = line;
    
        for(int idx=0; idx<starsToAppendOnBothSides; idx++){
            sb.insert(0, "*");  //appends to the beginning
            sb.append("*");     //appends to the end
        }
        for(int idx=0; idx<spacesToAppendOnBothSides; idx++){
            sb.insert(0, " ");
            sb.append(" "); //NOTE: You may exclude this line to avoid adding trailing spaces
        }
        System.out.println(sb.toString());
    }
    

    解释:

    1. 在第一次迭代(行 == 0)时,我们取一颗星,
    *
    
    1. 并在两边添加零个额外的星星(因为我们的 line# 是零),这给了我们(相同的字符串):
    *
    
    1. 然后添加 n-line-1(我们减去 1,因为我们已经添加了 1 个字符 - 第一个星) = 该星的每一侧有 3 个空格,这给了我们:
    ...*...
    

    如果我们应用相同的逻辑,则在第二次迭代(行 == 1): 1.

        *
    
        ***
         ^ This middle one is the first star
    
        ..***..
    

    理解逻辑后就很简单了。 有多种方法可以做到这一点,但这些是最简单的:)

    【讨论】:

      【解决方案3】:

      假设您需要打印n 行的金字塔。您可以看到i 行(其中i 介于1 和n 之间)将以n-i 空格开头并带有(i-1)*2+1 星号:

          for (int i = 1; i <= n; ++i) {
              int spaces = n-i;
              int stars = (i-1)*2+1;
              for (int j = 1; j <= spaces; ++j) {
                  System.out.print(' ');
              }
              for (int j = 1; j <= stars; ++j) {
                  System.out.print('*');
              }
              System.out.println();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        相关资源
        最近更新 更多