Java输出数字金字塔

=====taoyyz小陶©版权所有=====

实验一 输出如下图形,行数通过键盘输入的数据确定

要求:

  用死循环反复测试,即把绘制函数放入while()循环中
  其实就是金字塔形,不过跟传统的那种输出*堆砌的金字塔不一样,这个奇数行是1,偶数行是2

思路:

个人分析:
  第一行1个元素 共计1个字符
    第二行2个元素+1个空格 共计3个字符
    第二行3个元素+2个空格 共计5个字符
    …
    第n行n个元素+(n-1)个空格 共计n+(n-1)个字符,即2n-1个字符

  对齐图形,只需要在第1行前面补(2n-1)/2个空格字符
    第2行前面补(2n-1)/2-1个空格字符
    第i行前面补(2n-1)/2-(i-1)个空格字符
为了输出效果跟老师的一模一样,注意数字之间也要有空格分隔。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.experiment.exp1.DrawTriangle;

import java.util.Scanner;

/**
* @Author taoyyz(陶俊杰)
* @Date 2021/3/2 21:37
* @Version 1.0
*/

/*
输出如下图形,行数通过键盘输入的数据确定:(用死循环反复测试)

个人分析:
第一行1个元素 共计1个字符
第二行2个元素+1个空格 共计3个字符
第二行3个元素+2个空格 共计5个字符
...
第n行n个元素+(n-1)个空格 共计n+(n-1)个字符,即2n-1个字符

对齐图形,只需要在第1行前面补(2n-1)/2个空格字符
第2行前面补(2n-1)/2-1个空格字符
第i行前面补(2n-1)/2-(i-1)个空格字符
*/

public class DrawTriangle {
public static void main(String[] args) {
// draw(); //调用即可输出一次
//题目要求死循环反复测试
while (true) {
draw();
}
}

//draw函数 接收一个金字塔的行数并输出
public static void draw() {
boolean isOddNum = true;
System.out.print("请输入金字塔层数:");
int num = new Scanner(System.in).nextInt(); //接收金字塔层数
for (int i = 1; i <= num; i++) { //打印num层
for (int j = 0; j < (2 * num - 1) / 2 - (i - 1); j++) {
System.out.print(" "); //对齐金字塔,前面补相应个空格
}
//单数层
if (isOddNum) { //单数层输出1
System.out.print(1);
for (int printNum = 1; printNum < i; printNum++) {
System.out.print(" " + 1);
}
isOddNum = false; //下次是双(复)数层
//双数层
} else { //否则双(复)数层输出2
System.out.print(2);
for (int printNum = 1; printNum < i; printNum++) {
System.out.print(" " + 2);
}
isOddNum = true; //下次是单数层
}
System.out.println(); //换行
}
}
}

有个精简版,这里只展示draw()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void draw() {
System.out.print("请输入金字塔层数:");
int num = new Scanner(System.in).nextInt(); //接收金字塔层数
for (int i = 1; i <= num; i++) { //打印num层
for (int j = i; j < num; j++) {
System.out.print(" "); //对齐金字塔,前面补相应个空格
}
for (int j = 1; j <= i; j++) {
System.out.print(i % 2 == 1 ? "1 " : "2 ");
}
System.out.println();
}
}

运行截图:

JavaDrawTriangle01

心得:

这种输出金字塔、菱形、正方形(最简单)、矩形等等的题,考虑嵌套循环。这道题需要考虑奇数层/偶数层 输出的数字是不同的。顺带一提,在输出 数字+” “ 这种带空格的需要多次连接字符串,非常浪费性能,其实可以直接输出 “数字 “ 这样一个字符串就解决了。但是现在编译器一般会自动优化成第二种格式。

特别是对于菱形这种对称图形,在给定的” * “个数以内输出的话,可以先输出对称的其中一半,然后每次判断输出下一层还够不够。

💖💖💖这道题想做好就要动点脑子惹💖💖💖
感谢阅读💗