Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中构造金字塔_Java_Loops_For Loop_While Loop_Shapes - Fatal编程技术网

如何在Java中构造金字塔

如何在Java中构造金字塔,java,loops,for-loop,while-loop,shapes,Java,Loops,For Loop,While Loop,Shapes,如何使用循环程序构造一个金字塔,通过用户的输入给定若干行?比如 * *** ***** ******* 我试着看了几段视频,读了一些关于这一逻辑的文章,但老师们要么不理解,要么跳过了推理 我知道每一行增加2颗星,而且我知道因为每一行有奇数个星,我可以将一行中的星数定义为2n+1,其中n是一个整数。我注意到一个2排三角形的底边是3颗星,一个3排三角形的底边是5颗星,依此类推。所以对于第n行,三角形底面是n+(n-1),也就是2n-1。例如,r_5:base=9颗星。接下来我知道我的程

如何使用循环程序构造一个金字塔,通过用户的输入给定若干行?比如

   *
  ***
 *****
*******
我试着看了几段视频,读了一些关于这一逻辑的文章,但老师们要么不理解,要么跳过了推理

我知道每一行增加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循环来翻译所有这些呢

这是我的实现-

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));
    }
}
公共静态字符串重复(字符串str,int次){
返回新字符串(新字符[次])。替换(“\0”,str);
}
公共虚空createPyramid(整数大小){
对于(int i=1;i方法1
请注意,如果我们将当前行号表示为从0开始的“行”,将行总数表示为“n”

每行中的星星数=2*行+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());
}
  • 在两边加上零颗额外的星星(因为我们的线#是零),这会给我们(相同的字符串):
  • 然后添加n-line-1(我们减去1,因为我们已经添加了1个字符-第一颗星)=该颗星每侧3个空格,这给了我们:
  • 在第二次迭代中(第==1行),如果我们应用相同的逻辑: 一,

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

    假设您需要打印一个由
    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();
        }
    

    用于(int i=1;我想得很清楚:for循环允许循环体执行X次,其中X是一个有限的已知数。想想你的金字塔中有什么是已知的有限数?你的程序在完成它的工作之前需要询问用户的一件事是什么?正如操作说明一样,你需要多个循环。请记住,当您知道有多少次迭代时,将使用for循环,而当迭代次数不确定时,将使用while循环。考虑到这些知识点和知识点以及您以前对代数的理解,请按照Stephen C所说的做,并尝试一下。忽略发布的解决方案——有些东西告诉我你已经知道,你会从苦苦寻找答案中得到更多。我自己也尝试过编码,但通常我只会得到奇怪的对角化星或一列星。虽然我自己尝试过,但在某种程度上确实有所帮助,它让我意识到需要多个循环。例如,我很高兴我在这里得到了很多回应,我会再尝试一下等我今天晚些时候醒来
    
    *
    
    *
    
    ...*...
    
        *
    
        ***
         ^ This middle one is the first star
    
        ..***..
    
        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();
        }