在java中打印横向三角形

时间:2010-03-23 06:42:26

标签: java

我正在尝试在java中打印一个横向三角形。如果用户输入5,则输出应为:

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

如果用户输入6,则输出应为:

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

当用户输入5,3或1时,我已经让它适用于该情况,但我的代码似乎仅适用于这三种情况。我想知道是否有人可以帮助我让我的代码工作更多的情况。 这是:

public void printArrow( int n )
{ int asterisks = 1;
   for ( int i = 0; i <= n/2; i++ )
   {
       for ( int j = i; j < asterisks; j++ )
       {

         System.out.print( "*" );

        }
        asterisks += 3;
        System.out.println();
    }


    asterisks = asterisks / 2 - 2;
    for ( int i = 0;  i < n/2; i++ )
    {
        for ( int k = i; k < asterisks; k++ )
        {
            System.out.print( "*" );

        }
        if ( i == 1 )
        {
            System.out.print( "*" );
        }

        asterisks -= 2;
        System.out.println();
    }
}

3 个答案:

答案 0 :(得分:1)

使用递归解决这个问题要容易得多:

static String triangle(int n, String s) {
    return
        n == 0 ? "" :
        n == 1 ? s  :
        s
          + 
            triangle(n - 2, "**" + s)
          +
        s
    ;
}

public static void main(String args[]) {
    System.out.println(triangle(6, "*\n"));
}

三角形的结构是不言而喻的:

  • n == 0?没有线!
  • n == 1?一行!
  • 否则?夹着n - 2行的两条线! (它们更长!)

答案 1 :(得分:0)

好吧我会咬人吗

所以我们的目标是打印出三角形的星星。好吧,我们需要某种循环,可能还有另一个内部循环。而且我们知道它是对称的,因为它是一个三角形。

所以我开始打印第一半:

function triangle( input )
    i <- 1
    while i < input do
        for j from 1 to i do
            print "*"
        end for
        i <- i + 2
        print "\n"
    end while

在那之后我们需要处理三角形的后半部分,因为我们已经走到输入值意味着我们可以把它放回去。

    if i > input then i <- i - 2

    while i > 0 do
        for j from 1 to i do
            print "*"
        end for
        i <- i - 2
        print "\n"
    end while
end function triangle
几乎抓住了我的小技巧是在第二个之前减去两个,如果你不这样做,你会得到错误的答案。我会留下弄清楚为什么由你决定。如果伪代码表示混淆,请询问。

答案 2 :(得分:0)

double middle = ((double) lines) / 2;
int asterisks = 1;
for (int i = 1; i <= lines; i ++){
    for (int k = 0; k < asterisks; k ++) {
        System.out.print("*");
    }

    if (i < middle) {
        asterisks += 2;
    } else if (i > middle){
        asterisks -= 2;
    }
    System.out.println();
}

解释:

  • lines是输入数字(3,4,5,6,7等)
  • 将中间行作为双倍。即对于奇数,它将是x.5
  • 循环用于与输入
  • 一样多的行 每行上的
  • 打印与asterisks变量
  • 中的星号一样多的星号
  • 在每次迭代时,如果该行在中间之前,则将星号数增加2,如果在之后,则减少它。这意味着如果它相等,则没有任何反应 - 即同一行具有相同数量的星号。对于奇数,它不能相等。