在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();
}
}
答
好吧,我将会咬
所以我们的目标是打印出来的星三角形。那么我们将需要一个类似的循环,可能与另一个内部循环。而且我们知道它将会是对称的,因为它是一个三角形。
所以我一半的打印拳头开始:
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
行! (这更长!)
我闻到作业 – zellio 2010-03-23 06:46:12
其实这是一个我昨天所做的测试中的一个问题,我无法完全弄清楚。现在我很好奇。 – Will 2010-03-23 06:48:31
你是通过调试器追踪它的吗? – 2010-03-23 07:01:47