首页 > 解决方案 > 为什么在使用 for 循环打印金字塔时会得到意外的输出?

问题描述

如果5sc.input下面插入:

  *
 ***
*****

但是,我得到了以下信息:

   *
 ***
*****

有什么问题?

public void test3() {
    Scanner sc = new Scanner(System.in);
    int n1 = sc.nextInt();
    for(int i=0; i<n1; i++){
        if(i<=n1/2){
            for(int j=0; j<n1; j++) {
                if( j<(n1/2)-i || j>(n1/2)+i ) {
                    for(int m=0; m<(n1/2)-i; m++){
                        System.out.print(" ");
                    }
                    
                } /*else if( j==2 ) {
                    
                        System.out.print("*");
                    
                    
                }*/ else {
                    System.out.print("*");                       
                    
                }
            }
            System.out.println();
        }
    }
}

标签: javafor-loop

解决方案


您的循环中有一些逻辑错误:

for(int i=n1/2; i>=0; i--)  // (#1)
{
    for(int j=0; j<n1; j++) {
        if( j < i || j>n1-i-1 ) { // (#2) 
            System.out.print(" "); // (#3)
        } else {
            System.out.print("*");                       
        }
    }
    System.out.println();
}

我的评论(每个注释指的是特定的代码部分,见(#numbers)代码注释):

  1. 为什么要循环n1-1并检查 n1/2?这样你就跳过了一半的迭代,这是没有意义的。只需循环到,n1/2这样您就可以避免这种情况if-conditional
    更好的是:让我们数一数后院;以后会有用

  2. 我们需要您调节的品牌,以便了解何时必须打印空间。

    逻辑:在第一行(高i)我们需要打印更多的空格。随着i递减,我们将拥有越来越少的空格(直到最后一行,我们将拥有 0 个空格)。你只需要建立一个范围:

     if( j < i || j>n1-i-1 )
    

    最后一个 -1j>n1-i-1是必需的,因为范围是从 0 到n1-1

  3. 在我们找到j打印空间的正确条件后,我们就没事了。所以我们不再需要forloop打印空间了


请注意,此逻辑也适用于n1.

输出n1=7

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

输出n1=8


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

推荐阅读