前言
最近在学习java,遇到了一个经典打印题目,空心金字塔,初学者记录,根据网上教程,有一句话感觉很好,就是先把麻烦的问题转换成很多的简单问题,最后一一解决就可以了,然后先死后活,先把程序写死,后面在改成活的。
如下图是空心金字塔最终的实现效果,先要求用户输入层数然后输出
一.普通矩形
首先我们先把这个需求拆分,肯定是一堆星号里面扣出一个三角,那么我们先简单输出一个矩形,如下代码。
package test.test;
public class test {
public static void main(String[] args) {
//循环五次每次输出五个星号
for (int i = 1; i <=5 ; i++) {
System.out.println(\"*****\");
}
}
}
输出效果图如下,非常简单。
二.普通三角形
既然输出了普通矩形,那么我们就可以来思考如何输出三角形,如下分析,是我们想要输出的效果,第一层是输出的一个,第二层是输出的两个,以此内推,思路是我们可以使用循环嵌套,第一层循环用来循环层数,第二层循环用来循环每层星号的个数。
* //第一层为一个
** //第二层位两个
*** //第三层位三个
****
*****
意思就是我们每层循环的个数小于等于层数即可,如下增加代码。
package test.test;
public class test {
public static void main(String[] args) {
//i为层数
for (int i = 1; i <=5 ; i++) {
//j为每层个数
for (int j = 1; j <= i ; j++) {
//print和println的区别就是print输出不会自带换行println会
System.out.print(\"*\");
}
//每次循环完成一层那么就换行
System.out.print(\"\\n\");
}
}
}
如下图输出结果,可以输出三角形
三.输出等腰三角形
上面我们输出了普通三角形,我们现在需要输出等腰三角形,如下分析,也是我们需要输出的结果,首先可以发现,第一层为一个星号,第二层为三个星号,第三个为五个星号,是按按照奇数来的,但是也可以是2 * 层数 -1
,所以每层的个数是2 * 层数 -1
。
*
***
*****
*******
*********
如下代码修改,可以输出,修改的地方就是第二层循环j<=i
变成了j<= 2 * i - 1
,因为i代表的是层数。
package test.test;
public class test {
public static void main(String[] args) {
//i为层数
for (int i = 1; i <=5 ; i++) {
//j为每层个数
for (int j = 1; j <= 2 * i - 1 ; j++) {
//print和println的区别就是print输出不会自带换行println会
System.out.print(\"*\");
}
//每次循环完成一层那么就换行
System.out.print(\"\\n\");
}
}
}
如下图输出效果,发现没有输出我们想要的效果。
我们需要进行修改,我们再来看一下最终效果,如下,发现前面是有空格的,空格的规律是啥啊?数一数可以发现,第一层的空格是四个,第二层的空格是3个,第三层的空格是2个……,仔细思考,发现就是总层数减去当前层数,比如第一层就是5-1
,第二层就是5-2
。
*
***
*****
*******
*********
思路是这样,代码的思路就是先在前面打印完成空格之后在打印星号,如下代码修改,修改的地方是在第二层循环的前面,加上了一个循环,是为了循环输出空格。
package test.test;
public class test {
public static void main(String[] args) {
//i为当前层数
for (int i = 1; i <=5 ; i++) {
//打印空格
for (int k = 1; k <= 5-i; k++) {
System.out.print(\" \");
}
//j为每层个数
for (int j = 1; j <= 2 * i - 1 ; j++) {
//print和println的区别就是print输出不会自带换行println会
System.out.print(\"*\");
}
//每次循环完成一层那么就换行
System.out.print(\"\\n\");
}
}
}
如下输出效果。
四.输出空心金字塔
前面已经输出了等腰三角形,现在需要把里面掏空,最终效果应该如下,分析一下怎么才能这样输出,首先不变的是第一层和最后一层,变化的是中间的层数,发现中间的都是输出了第一个和最后一个星号,最后一排就是输出全部
*
* *
* *
* *
*********
思路是,第一个星号即为判断,当j==1
的时候那么就是输出第一个星号,当j == 2 * i - 1
的时候即可输出最后一个星号,所以代码如下,更改的地方在循环每层循环的地方,加了一个判断,j==1
的时候也就是输出每层第一个的时候,j == 2 * i -1
的时候就是输出最后一个的时候。
package test.test;
public class test {
public static void main(String[] args) {
//i为当前层数
for (int i = 1; i <=5 ; i++) {
//打印空格
for (int k = 1; k <= 5-i; k++) {
System.out.print(\" \");
}
//j为每层个数
for (int j = 1; j <= 2 * i - 1 ; j++) {
if (j == 1 || j == 2 * i - 1) {
//print和println的区别就是print输出不会自带换行println会
System.out.print(\"*\");
} else {
System.out.print(\" \");
}
}
//每次循环完成一层那么就换行
System.out.print(\"\\n\");
}
}
}
输出结果如下图,发现还是有一点问题。
问题出在判断的地方,最后一排应该是不用动的所以在判断的时候判断,如果i == 5
的时候,那么还是一直输出,也就是当每层层数等于5的时候那么还是会输出星号。
如下修改代码。
package test.test;
public class test {
public static void main(String[] args) {
//i为当前层数
for (int i = 1; i <=5 ; i++) {
//打印空格
for (int k = 1; k <= 5-i; k++) {
System.out.print(\" \");
}
//j为每层个数
for (int j = 1; j <= 2 * i - 1 ; j++) {
if (j == 1 || j == 2 * i - 1 || i == 5) {
//print和println的区别就是print输出不会自带换行println会
System.out.print(\"*\");
} else {
System.out.print(\" \");
}
}
//每次循环完成一层那么就换行
System.out.print(\"\\n\");
}
}
}
输出结果如下,发现成功输出空心金字塔。
五.实现先死后活
既然效果完成了,那么现在需要实现的是,可以自定义层数,让用户来输入层数,然后再来循环,很简单,思路就是使用scanner
来接收,然后把下面每层的数字变成变量即可,代码如下。
package test.test;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
//接收用户输入的值
Scanner input = new Scanner(System.in);
System.out.println(\"请输入层数字:\");
int ceng = input.nextInt();
//i为当前层数
for (int i = 1; i <= ceng ; i++) {
//打印空格
for (int k = 1; k <= ceng-i; k++) {
System.out.print(\" \");
}
//j为每层个数
for (int j = 1; j <= 2 * i - 1 ; j++) {
if (j == 1 || j == 2 * i - 1 || i == ceng) {
//print和println的区别就是print输出不会自带换行println会
System.out.print(\"*\");
} else {
System.out.print(\" \");
}
}
//每次循环完成一层那么就换行
System.out.print(\"\\n\");
}
}
}
输出效果如下图,会先叫我们输入数字来当作层数
因为我本人也是学习当中,如果有什么不对的地方,欢迎指正!(~ ̄▽ ̄)~
来源:https://www.cnblogs.com/takagisan/p/16202767.html
本站部分图文来源于网络,如有侵权请联系删除。