问题是你开始用1星号(x = 1)而不是3来绘制沙漏的底部。
第二个问题是,沙漏的底部只有N-2线,不N-1所以循环应该从1开始,而不是0。这是因为有一个星号线在上半部分已经被绘制。
更正代码:
public static void main(String[] args) {
int N = StdIn.readInt();
int x = N*2-1;
for (int i = 0; i < N; i++) {
for (int j = i; j > 0; j--) {
StdOut.print(" ");
}
for (int k = 0; k < x; k++) {
StdOut.print("*");
}
x-=2;
StdOut.println();
}
x = 3; //
for (int i = 1; i < N; i++) { //
for (int j = i; j < N-1; j++) {
StdOut.print(" ");
}
for (int k = 0; k < x; k++) {
StdOut.print("*");
}
x += 2;
StdOut.println();
}
}
作为旁注,您可以通过进行以下观察来更短地重写此代码:
有x线绘制,所以我们可以循环从0到x包括(尊重对称性),并跳过中间线,以便不绘制它两次
对于每一行,都有要绘制的x列,它可以是空格或*。
对于每一个线,*绘制仅当当前列是min(i, x-i)和max(i, x-i)(如果我们在上部,i < x-i和如果我们在底部部分,i > x-i)。之间
码:
public static void main(String[] args) {
int N = 4;
int x = 2 * N - 1;
for (int i = 0; i <= x; i++) {
if (i == N) continue; // skip the middle-line for it not to be drawn twice
for (int j = 0; j < x; j++) {
System.out.print(j >= Math.min(i, x-i) && j < Math.max(i, x-i) ? "*" : " ");
}
System.out.println();
}
}样本输出:
*******
*****
***
*
***
*****
*******