java - 为什么在使用 for 循环打印金字塔时会得到意外的输出?
问题描述
如果5
在sc.input
下面插入:
*
***
*****
但是,我得到了以下信息:
*
***
*****
有什么问题?
public void test3() {
Scanner sc = new Scanner(System.in);
int n1 = sc.nextInt();
for(int i=0; i<n1; i++){
if(i<=n1/2){
for(int j=0; j<n1; j++) {
if( j<(n1/2)-i || j>(n1/2)+i ) {
for(int m=0; m<(n1/2)-i; m++){
System.out.print(" ");
}
} /*else if( j==2 ) {
System.out.print("*");
}*/ else {
System.out.print("*");
}
}
System.out.println();
}
}
}
解决方案
您的循环中有一些逻辑错误:
for(int i=n1/2; i>=0; i--) // (#1)
{
for(int j=0; j<n1; j++) {
if( j < i || j>n1-i-1 ) { // (#2)
System.out.print(" "); // (#3)
} else {
System.out.print("*");
}
}
System.out.println();
}
我的评论(每个注释指的是特定的代码部分,见(#numbers)
代码注释):
为什么要循环
n1-1
并检查 n1/2?这样你就跳过了一半的迭代,这是没有意义的。只需循环到,n1/2
这样您就可以避免这种情况if-conditional
。
更好的是:让我们数一数后院;以后会有用我们需要您调节的品牌,以便了解何时必须打印空间。
逻辑:在第一行(高
i
)我们需要打印更多的空格。随着i
递减,我们将拥有越来越少的空格(直到最后一行,我们将拥有 0 个空格)。你只需要建立一个范围:if( j < i || j>n1-i-1 )
最后一个 -1
j>n1-i-1
是必需的,因为范围是从 0 到n1-1
在我们找到
j
打印空间的正确条件后,我们就没事了。所以我们不再需要forloop
打印空间了
请注意,此逻辑也适用于n1
.
输出n1=7
:
*
***
*****
*******
输出n1=8
:
**
****
******
********
推荐阅读
- html - 如何防止图像的边距可点击?
- kubernetes - kubernetes 客户端中是否有替换“kubectl port-forward”命令的方法
- struct - 自动填充 SystemVerilog 打包结构,以便它们可以放入联合中
- c# - 使用 HttpClient 将 Content-Type 设置为“application/json”并将对象添加到正文
- python - 致命的 Python 错误:initfsencoding:无法加载文件系统编解码器 ModuleNotFoundError:没有名为“encodings”的模块
- angular - 如何解决重复标识符“按”错误?
- validation - Vuelidate 日期输入
- c - 书上说 c 标准提供了六位有效数字的浮点精度,但这不是真的吗?
- google-apps-script - Google Apps 脚本 - 有条件的用户输入 - 数字提示
- python - 来自非负数据集的欢乐图中的负值