在java中打印横向三角形

问题描述:

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

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

如果用户输入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(); 
    } 
} 
+1

我闻到作业 – zellio 2010-03-23 06:46:12

+0

其实这是一个我昨天所做的测试中的一个问题,我无法完全弄清楚。现在我很好奇。 – Will 2010-03-23 06:48:31

+0

你是通过调试器追踪它的吗? – 2010-03-23 07:01:47

好吧,我将会咬

所以我们的目标是打印出来的星三角形。那么我们将需要一个类似的循环,可能与另一个内部循环。而且我们知道它将会是对称的,因为它是一个三角形。

所以我一半的打印拳头开始:

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 

在它的小动作,几乎抓住了我是两个第二,而之前的减法,如果你不这样做,你会得到错误的答案。我会留下找出为什么取决于你。如果在伪代码符号中存在混淆,请询问。

+0

感谢您的回复。我明天会详细检查一下。这里迟到了,我必须明天早起。 再次感谢! – Will 2010-03-23 07:07:31

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可变
  • 在每次迭代要么增加星号的数目如果该行在中间之前,或者如果在之后,则减少该行。这意味着如果相等,则不会发生任何事情 - 即同一行具有相同数量的星号。奇数不能相等。

解决这个使用递归这是很容易:

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行! (这更长!)