思路:输出一个n行等腰三角形。
- 第一行:1个星
- 第二行:3个星
- 第三个: 5个星
- 第n行:2n-1个星
1. 外层循环就是n行, For (int i=1;i<=n;i++)
2. 内层循环就是打内容,打2n-1个内容,要么是空格要么是星星,怎么判断哪些位置要打星星,如果只打3行,那么第三行,中间的位置就是n,最后一行是全部打星星,n的左边是n-1,n-2,n-3直到结果为1为止,那就是n-(n-1) n 右边的位置是n+(n-1),因为是对称的,那么设p=n-1,如果内层循环是j个内容 for (int j=1;j<=2n-1;j++),那么需要打星星的位置就是在n-p和n+p 之间,其他地方都打空格。
import java.util.Scanner;
public class IsoscelessTriangle {
public static void main(String[] args) {
Scanner line = new Scanner(System.in);
System.out.print("你要输出几行的等腰三角形,输入行数即可");
int n = line.nextInt();
line.close();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= 2 * n - 1; j++) {
int p = i - 1;
if (j >= n - p && j <= n + p) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
}
你的代码逻辑清晰,功能实现准确,整体没问题,但如果要说优化,给你几点前瞻性建议,帮你写得更简洁高效,也更易维护:
-
避免每次循环都计算
p = i - 1
其实你每行的p是固定的,可以提前计算或者用更直接的表达式,减少冗余赋值。 -
内层循环的边界计算
你用的j >= n - p && j <= n + p判断打印*,本质是让星号区间以中心为基准,逐行扩展。
可以先计算left = n - p,right = n + p,在内层循环外面做,避免每次循环都计算。 -
变量命名更语义化
line用来接收Scanner,命名上可以用scanner,更直观。
p也可以用更有意义的名称,比如offset。 -
用户交互优化
System.out.print("你要输出几行的等腰三角形,输入行数即可"),可以考虑换成println,让输入更整洁。 -
代码扩展性考虑
你写的是等腰三角形打印,如果以后想扩展成空心三角形、倒三角形、菱形等,建议拆成函数模块,方便复用。
“offset”在编程里一般指“偏移量”,就是相对于某个基准点的距离或差值。