我一直致力于自学考试,如果我尝试使用下面的代码打印沙漏,我似乎无法做到这一点。还在学习。
public class test
{
public static void hourglass(int size, char symbol){
for(int i=size-1;i>=1;i--){
for(int j=i;j<size;j++)
System.out.print(" ");
for(int j=1;j<=i*2-1;j++)
System.out.print(symbol);
System.out.println();
}
for(int i=2;i<=size-1;i++)
{
for(int j=i;j<size;j++)
System.out.print(" ");
for(int j=1;j<=i*2-1;j++)
System.out.print(symbol);
System.out.println();
}
}
}
它将完美打印3:
如果我尝试用数字5和7打印它
5:
然后 7:
我将如何纠正这个问题?
答案 0 :(得分:1)
我运行了代码,发现了一些有趣的东西。如果您在不正确的沙漏中发现,顶部和底部会有一排额外的“A”。这必然意味着循环运行太多。如果我们看一下你的第一个循环
for(int i = size - 1; i >= 1; i--) {
特别是声明部分,我们看到它从size - 1
开始,这只适用于3的高度。好吧,Math.floor(size / 2) == 1
其中size == 3
。
我们可以在第二个主循环中看到类似的情况。
for(int i = 2; i <= size - 1; i++) {
这次size - 1
部分位于循环的条件部分。
所以解决方案很简单,我们需要做的就是声明一个变量并用它来减去循环的前面两个部分。我将变量称为“减法”,但您可以随意调用它。
int subtract = (int)Math.floor(size / 2);
然后我们只减去subtract
而不是减去1。
第一循环:
for(int i = size - subtract; i >= 1; i--) {
第二次循环:
for(int i = 2; i <= size - subtract; i++) {
这将使其正常工作。请记住,这仅适用于size
的偶数值。