首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中构建金字塔

如何在Java中构建金字塔
EN

Stack Overflow用户
提问于 2019-10-15 13:32:49
回答 3查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
   *
  ***
 *****
*******

我试着看了几个视频,阅读了一些关于这一逻辑的文章,但教师要么无法理解,要么他们跳过了推理。

我知道每行增加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循环中转换这一切呢?

EN

回答 3

Stack Overflow用户

发布于 2019-10-15 14:10:30

方法1

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

每行的星数=2*行+1

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

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

代码语言:javascript
复制
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());
}

方法2

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

代码语言:javascript
复制
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());
}

解释:

在第一次迭代中(行== 0),我们取一颗星,

代码语言:javascript
复制
*

  1. 并在两边添加零个额外的星号(因为我们的line#是零),这给了我们(相同的字符串):

代码语言:javascript
复制
*

行,然后添加n-

  • -1(我们减去1,因为我们已经添加了1个字符-第一个星号)=该星号两侧的3个空格,这就得到了:

代码语言:javascript
复制
...*...

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

代码语言:javascript
复制
    *

代码语言:javascript
复制
    ***
     ^ This middle one is the first star

代码语言:javascript
复制
    ..***..

一旦你理解了其中的逻辑,那就非常简单了。有多种方法可以做到这一点,但以下是最简单的方法之一:)

票数 4
EN

Stack Overflow用户

发布于 2019-10-15 14:15:27

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

代码语言:javascript
复制
    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();
    }
票数 1
EN

Stack Overflow用户

发布于 2019-10-15 13:59:21

下面是我的实现:

代码语言:javascript
复制
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。这将给出*之前和之后的空格数量,在中间我们只需要打印*的数量。所以,我们最后打印它们。repeat函数创建一个由str参数times times形成的字符串。例如-如果我们调用repeat("abc", 3),它将返回"abcabcabc“。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58387801

复制
相关文章

相似问题

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