
本文详解如何在 Java 中生成一个 a×a 乘法表,并通过条件控制跳过左上三角区域(即仅显示满足 i + j ≥ maxnum 的右下三角部分),实现清晰、对齐的三角形乘法表输出。
本文详解如何在 java 中生成一个 a×a 乘法表,并通过条件控制跳过左上三角区域(即仅显示满足 `i + j ≥ maxnum` 的右下三角部分),实现清晰、对齐的三角形乘法表输出。
要实现“删除乘法表左上三角”(即只保留右下三角区域),关键在于理解坐标规律:观察标准乘法表(行索引为 i,列索引为 j,均从 0 开始),左上三角对应的是 i + j 的单元格;而右下三角(含对角线)则满足 <code>i + j >= maxnum。因此,只需在内层循环中添加判断,对不满足条件的位置输出空格(保持列宽对齐),满足条件时才输出 i * j。
以下是完整、可运行的优化代码(已修复原代码中的逻辑错误与格式问题):
import java.util.Scanner;
public class MultiTable {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Please enter a positive max. number: ");
int maxnum = in.nextInt();
// 输入校验:要求正整数
while (maxnum <= 0) {
System.out.print("Please enter a positive max. number: ");
maxnum = in.nextInt();
}
// 打印顶部标题行:首列为" ",后接 1~maxnum(注意:题目示例中列头是 1-based)
System.out.printf("%10s", ""); // 左上角空白(行列标交叉处)
for (int col = 1; col <= maxnum; col++) {
System.out.printf("%5d", col);
}
System.out.println();
// 打印分隔线(长度匹配:1个10字符 + maxnum个5字符)
System.out.print("----------"); // 对应"%10s"
for (int col = 0; col < maxnum; col++) {
System.out.print("-----");
}
System.out.println();
// 主体:逐行打印(行号 i 从 0 到 maxnum,但实际有效行从 i=0 开始;列 j 从 0 到 maxnum)
for (int i = 0; i <= maxnum; i++) {
// 行首:打印行号 + 分隔符(如 " 0 |")
System.out.printf("%3d%2s", i, " |");
// 内层循环:遍历每列 j(0 到 maxnum),仅当 i+j >= maxnum 时显示乘积
for (int j = 0; j <= maxnum; j++) {
if (i + j >= maxnum) {
System.out.printf("%5d", i * j);
} else {
System.out.printf("%5s", ""); // 用5字符宽度的空字符串占位,确保列对齐
}
}
System.out.println();
}
in.close();
}
}关键说明与注意事项:
- ✅ 对齐核心:使用
printf("%5d")和printf("%5s")统一每列宽度为 5 字符,避免因空格数量不一致导致错位;不可改用print(" "),否则无法保证严格对齐。 - ✅ 索引逻辑:
i表示行(0 到maxnum),j表示列(0 到maxnum),i + j >= maxnum精确覆盖右下三角(含主对角线延伸区)。例如maxnum=4时,(0,4)、(1,3)、(2,2)、(3,1)、(4,0)及其右下方均被保留。 - ⚠️ 边界处理:原题图中列头为
1,2,3,...,maxnum(非0,1,...,maxnum),因此顶部标题行需单独按1起始循环;而表格主体仍以i=0行开始,以兼容0×j=0的数学意义。 - ? 调试建议:若输出异常,优先检查
printf格式串是否漏掉%或参数类型不匹配(如误将""当作int);也可临时加入System.out.printf("[i=%d,j=%d]", i, j)辅助验证条件触发位置。
通过这一条件过滤机制,你不仅能完成作业要求,更掌握了基于坐标关系控制二维输出的核心编程思维——这正是从“写程序”迈向“设计程序”的重要一步。

















