用*输出一个等腰三角形

朱治龙
2023-03-14 / 0 评论 / 15 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年03月14日,已超过666天没有更新,若内容或图片失效,请留言反馈。

缘起

工作间隙,得到一个刚学编程时的题目,题目如下:

输出一个等腰三角形。提示用户输入一个整数 ,代表输出的等边三角形由n行组成。
例:输入n=5。输出:

    *    
   ***   
  *****  
 ******* 
*********

lf7vghfe.png

朋友提供的代码如下:

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)
}

输出结果:

lf7vo6p5.png

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));
        }
    }
}

输出结果如下:

lf7vrfsv.png

0

评论 (0)

取消