前言

最近在学习java,遇到了一个经典打印题目,空心金字塔,初学者记录,根据网上教程,有一句话感觉很好,就是先把麻烦的问题转换成很多的简单问题,最后一一解决就可以了,然后先死后活,先把程序写死,后面在改成活的。

如下图是空心金字塔最终的实现效果,先要求用户输入层数然后输出


一.普通矩形

首先我们先把这个需求拆分,肯定是一堆星号里面扣出一个三角,那么我们先简单输出一个矩形,如下代码。

  1. package test.test;
  2. public class test {
  3. public static void main(String[] args) {
  4. //循环五次每次输出五个星号
  5. for (int i = 1; i <=5 ; i++) {
  6. System.out.println("*****");
  7. }
  8. }
  9. }

输出效果图如下,非常简单。


二.普通三角形

既然输出了普通矩形,那么我们就可以来思考如何输出三角形,如下分析,是我们想要输出的效果,第一层是输出的一个,第二层是输出的两个,以此内推,思路是我们可以使用循环嵌套,第一层循环用来循环层数,第二层循环用来循环每层星号的个数。

  1. * //第一层为一个
  2. ** //第二层位两个
  3. *** //第三层位三个
  4. ****
  5. *****

意思就是我们每层循环的个数小于等于层数即可,如下增加代码。

  1. package test.test;
  2. public class test {
  3. public static void main(String[] args) {
  4. //i为层数
  5. for (int i = 1; i <=5 ; i++) {
  6. //j为每层个数
  7. for (int j = 1; j <= i ; j++) {
  8. //print和println的区别就是print输出不会自带换行println会
  9. System.out.print("*");
  10. }
  11. //每次循环完成一层那么就换行
  12. System.out.print("\n");
  13. }
  14. }
  15. }

如下图输出结果,可以输出三角形


三.输出等腰三角形

上面我们输出了普通三角形,我们现在需要输出等腰三角形,如下分析,也是我们需要输出的结果,首先可以发现,第一层为一个星号,第二层为三个星号,第三个为五个星号,是按按照奇数来的,但是也可以是2 * 层数 -1,所以每层的个数是2 * 层数 -1

  1. *
  2. ***
  3. *****
  4. *******
  5. *********

如下代码修改,可以输出,修改的地方就是第二层循环j<=i变成了j<= 2 * i - 1,因为i代表的是层数。

  1. package test.test;
  2. public class test {
  3. public static void main(String[] args) {
  4. //i为层数
  5. for (int i = 1; i <=5 ; i++) {
  6. //j为每层个数
  7. for (int j = 1; j <= 2 * i - 1 ; j++) {
  8. //print和println的区别就是print输出不会自带换行println会
  9. System.out.print("*");
  10. }
  11. //每次循环完成一层那么就换行
  12. System.out.print("\n");
  13. }
  14. }
  15. }

如下图输出效果,发现没有输出我们想要的效果。

我们需要进行修改,我们再来看一下最终效果,如下,发现前面是有空格的,空格的规律是啥啊?数一数可以发现,第一层的空格是四个,第二层的空格是3个,第三层的空格是2个……,仔细思考,发现就是总层数减去当前层数,比如第一层就是5-1,第二层就是5-2

  1. *
  2. ***
  3. *****
  4. *******
  5. *********

思路是这样,代码的思路就是先在前面打印完成空格之后在打印星号,如下代码修改,修改的地方是在第二层循环的前面,加上了一个循环,是为了循环输出空格。

  1. package test.test;
  2. public class test {
  3. public static void main(String[] args) {
  4. //i为当前层数
  5. for (int i = 1; i <=5 ; i++) {
  6. //打印空格
  7. for (int k = 1; k <= 5-i; k++) {
  8. System.out.print(" ");
  9. }
  10. //j为每层个数
  11. for (int j = 1; j <= 2 * i - 1 ; j++) {
  12. //print和println的区别就是print输出不会自带换行println会
  13. System.out.print("*");
  14. }
  15. //每次循环完成一层那么就换行
  16. System.out.print("\n");
  17. }
  18. }
  19. }

如下输出效果。


四.输出空心金字塔

前面已经输出了等腰三角形,现在需要把里面掏空,最终效果应该如下,分析一下怎么才能这样输出,首先不变的是第一层和最后一层,变化的是中间的层数,发现中间的都是输出了第一个和最后一个星号,最后一排就是输出全部

  1. *
  2. * *
  3. * *
  4. * *
  5. *********

思路是,第一个星号即为判断,当j==1的时候那么就是输出第一个星号,当j == 2 * i - 1的时候即可输出最后一个星号,所以代码如下,更改的地方在循环每层循环的地方,加了一个判断,j==1的时候也就是输出每层第一个的时候,j == 2 * i -1的时候就是输出最后一个的时候。

  1. package test.test;
  2. public class test {
  3. public static void main(String[] args) {
  4. //i为当前层数
  5. for (int i = 1; i <=5 ; i++) {
  6. //打印空格
  7. for (int k = 1; k <= 5-i; k++) {
  8. System.out.print(" ");
  9. }
  10. //j为每层个数
  11. for (int j = 1; j <= 2 * i - 1 ; j++) {
  12. if (j == 1 || j == 2 * i - 1) {
  13. //print和println的区别就是print输出不会自带换行println会
  14. System.out.print("*");
  15. } else {
  16. System.out.print(" ");
  17. }
  18. }
  19. //每次循环完成一层那么就换行
  20. System.out.print("\n");
  21. }
  22. }
  23. }

输出结果如下图,发现还是有一点问题。

问题出在判断的地方,最后一排应该是不用动的所以在判断的时候判断,如果i == 5的时候,那么还是一直输出,也就是当每层层数等于5的时候那么还是会输出星号。

如下修改代码。

  1. package test.test;
  2. public class test {
  3. public static void main(String[] args) {
  4. //i为当前层数
  5. for (int i = 1; i <=5 ; i++) {
  6. //打印空格
  7. for (int k = 1; k <= 5-i; k++) {
  8. System.out.print(" ");
  9. }
  10. //j为每层个数
  11. for (int j = 1; j <= 2 * i - 1 ; j++) {
  12. if (j == 1 || j == 2 * i - 1 || i == 5) {
  13. //print和println的区别就是print输出不会自带换行println会
  14. System.out.print("*");
  15. } else {
  16. System.out.print(" ");
  17. }
  18. }
  19. //每次循环完成一层那么就换行
  20. System.out.print("\n");
  21. }
  22. }
  23. }

输出结果如下,发现成功输出空心金字塔。


五.实现先死后活

既然效果完成了,那么现在需要实现的是,可以自定义层数,让用户来输入层数,然后再来循环,很简单,思路就是使用scanner来接收,然后把下面每层的数字变成变量即可,代码如下。

  1. package test.test;
  2. import java.util.Scanner;
  3. public class test {
  4. public static void main(String[] args) {
  5. //接收用户输入的值
  6. Scanner input = new Scanner(System.in);
  7. System.out.println("请输入层数字:");
  8. int ceng = input.nextInt();
  9. //i为当前层数
  10. for (int i = 1; i <= ceng ; i++) {
  11. //打印空格
  12. for (int k = 1; k <= ceng-i; k++) {
  13. System.out.print(" ");
  14. }
  15. //j为每层个数
  16. for (int j = 1; j <= 2 * i - 1 ; j++) {
  17. if (j == 1 || j == 2 * i - 1 || i == ceng) {
  18. //print和println的区别就是print输出不会自带换行println会
  19. System.out.print("*");
  20. } else {
  21. System.out.print(" ");
  22. }
  23. }
  24. //每次循环完成一层那么就换行
  25. System.out.print("\n");
  26. }
  27. }
  28. }

输出效果如下图,会先叫我们输入数字来当作层数


因为我本人也是学习当中,如果有什么不对的地方,欢迎指正!(~ ̄▽ ̄)~

java实现空心金字塔的更多相关文章

  1. php练习——打印半金字塔、金字塔、空心金字塔、菱形、空心菱形

    半金字塔 金字塔 空心金字塔 菱形     空心菱形

  2. java打印正金字塔,倒金字塔和“水影”金字塔

    java打印正金字塔,倒金字塔和"水影"金字塔 --------原创文章,若要转载,请注明出处   小小少年 闲来无事,想起自己初学java的时候做的经典的无非就是打印出一些有意思 ...

  3. Java打印空心三角

    Java打印空心三角 public static void main(String[] args) { int n=5; //n表示输出空心三角形行数,这里以5行为例 for(int i=1;i< ...

  4. Java打印空心菱形

    使用Java打印空心菱形 public static void main(String[] args) { int n = 5; //这里输出菱形的上半部分 for (int i = 1; i < ...

  5. Javascript打印金字塔,倒立金字塔,空心金字塔,菱形,空心菱形等

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. java简单打印金字塔(案例)

    学习编程语言,打印简单的金字塔是基础的案例,在这里就简单的写了个案例,希望能帮助到各位 代码 效果 class  kinTa{    public static void main(String[] ...

  7. java代码实现 金字塔(倒置)

    在jsp中实现如图所示的金字塔,,代码如下: 大致思路如下: 1.先画出前5行.因为 i+空格数=总行数,所以第一行的空格数是 总行数-i(第几行),然后画出 *,*的数目=2*i-11: 2.在画出 ...

  8. java输出空心菱形

    package com.zsh; import java.util.Scanner; public class Test08 { public static void main(String[] ar ...

  9. Java温故而知新-空心菱形

    空心菱形 今天做题练手,题目是空心菱形,一开始没什么思路,去网上找了找,发现很难找到讲的通透的,自己现在独立做出来了,记录一下,以备后用. * * * * * * * * * * * * * * * ...

随机推荐

  1. 利用Properties类关联相关配置文件

    文件目录 代码: package Lianxi;import java.io.FileInputStream;import java.io.FileNotFoundException;import j ...

  2. MATLAB设计模糊控制器并用simulink仿真

    一.设计模糊控制器1.1 创建项目文件夹在此路径如图 1.2 打开MATLAB打开MATLAB R2012a切换当前目录为上一步路径,如图 1.3 设计模糊控制器打开模糊控制器设计对话框 根据模糊控制 ...

  3. 好用开源的C#快速开发平台

    NFine 是基于 C# 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展,让Web开发更迅速.简单.NFine是一套基于 ASP.NET ...

  4. gulp详细基础教程

    一.gulp简介 1.gulp是什么? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成: ...

  5. SQL之总结(三)

    1.怎么在where指定多个值得问题? select * from tb_article where article_id in(10008,10009) 结果如下: 如果是字符串的话: select ...

  6. 从ES6重新认识JavaScript设计模式(三): 建造者模式

    1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...

  7. 我的python学习记_02

    流程控制 算术运算符: + 加(在字符串中拼接作用) - 减 * 乘 / 除 // 商 % 取余 ** 次幂 比较运算符: > 是否大于 >= 是否大于等于 < 是否小于 != 是否 ...

  8. 大数据学习之路之sqoop导入

    按照网上的代码导入 hadoop(十九)-Sqoop数据清洗 - 简书 (jianshu.com) ./sqoop import --connect "jdbc:mysql://192.16 ...

  9. 界面跳转+信息传递+AS中如何将ADV转移到其他盘中

    今日所学:界面跳转 信息传递 遇到的问题: 昨天遇到不能新建java类,在网上百度了很多,大多原因是没有新建java类的模板,但是我有,换了一个新的新建的方式后,发现虽然能建立了,但在测试时还是不能页 ...

  10. 获取bootstrap模态框点击的对应项(e.relatedTarget.dataset)

    //获取绑定的自定义属性值<ul> <li data-toggle="modal" data-index="电表1111" data-targ ...