java沙漏_Java - 沙漏

问题是你开始用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();

}

}样本输出:

*******

*****

***

*

***

*****

*******

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值