缘起
工作间隙,得到一个刚学编程时的题目,题目如下:
用输出一个等腰三角形。提示用户输入一个整数 ,代表输出的等边三角形由n行组成。
例:输入n=5。输出:
*
***
*****
*******
*********
朋友提供的代码如下:
public static void main(String[] args) {
System.out.println("请输入需要的行数(不可输入0):");
Scanner scanner = new Scanner(System.in);
int rows = scanner.nextInt();
int rowIndex = rows - 1;
//最后一行总个数
int total = 1 + (rows - 1) * 2;
// 每行*个数
int num = 1;
// 打印标记
boolean flag = false;
if (rows != 0) {
for (int i = 0; i < rows; i++) {
for (int j = 0, k = 0; j < total; j++) {
// 倒数第几行就从第几个下标开始
if (j == rowIndex - i) {
flag = true;
}
if (flag && k < num) {
System.out.print("*");
// 开始打印计数
k++;
} else {
System.out.print(" ");
// 结束打印
flag = false;
}
}
num = num + 2;
System.out.println();
}
}
}
整段代码看下来实现方式有些复杂,感觉有些陷在循环里了,脑袋里不跟着一行一行的跑代码的话,不怎么能想出来结果输出是怎样的。
于是,我从头开始梳理了下需要输出的东西,主要是要从中找寻规律:
第一步:手工输出前几个结果,从结果中找规律
2:
*
***
3:
*
***
*****
4:
*
***
*****
*******
5:
*
***
*****
*******
*********
6:
*
***
*****
*******
*********
***********
7:
*
***
*****
*******
*********
***********
*************
第二步:分析得出如下规律:
令 行数为1开始,当前行的输出情况如下:
星号数量 = 当前行数 * 2 - 1
左侧空格数量 = 总行数 - 当前行数
得出规律后,就能够很好的着手后面的代码工作了,以下是我提供的代码:
JS版:
/**
* 输出三角形
* @param rows 三角形行数
*/
let showTriangle = (rows) => {
console.log(`输出${rows}等腰三角形:`)
// 如果小于2的话不能构成等腰三角形
if (rows < 2) {
console.error('必须大于1')
return;
}
for (let row = 1; row <= rows; row++) {
// 输出空格
let rowStr = ''
for (let blankIndex = 0; blankIndex < rows - row; blankIndex++) {
rowStr += ' '
}
// 输出星号
for (let starIndex = 0; starIndex < row * 2 - 1; starIndex++) {
rowStr += '*'
}
console.log(rowStr)
}
}
// 测试输出:
for (let i = 0; i < 15; i++) {
showTriangle(i)
}
输出结果:
Java 版
由于使用了 String.repeat(), JDK 版本应 >= 11,若 JDK 低于 11 也可以用循环实现。
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* @author zhuzl
*/
public class ShowTriangle {
public static void main(String[] args) {
System.out.println("请输入三角形的行数(需大于1):");
Scanner scanner = new Scanner(System.in);
int rows = scanner.nextInt();
printTriangle(rows);
}
/**
* 打印等腰三角形
*
* @param rows 三角形行数
*/
private static void printTriangle(int rows) {
if (rows < 2) {
throw new InputMismatchException("必须大于1");
}
for (int row = 1; row <= rows; row++) {
System.out.println(" ".repeat(rows - row) + "*".repeat(row * 2 - 1));
}
}
}
输出结果如下:
评论 (0)