Java实现老式竖式乘法随机出题器排版对齐问题求助
乘法竖式排版对齐问题修复
问题核心
当前代码存在两个导致错位的问题:
- 打印被乘数、乘数行时硬编码前置空格,没有根据数字长度设定统一的对齐基准
- 逐位输出中间乘积时,直接将乘积和末尾占位的
×拼接,没有预留对应前置缩进,导致数字部分没有和最终结果保持右对齐
修复思路
所有竖式行统一以最终乘积的右端为对齐基准,按右对齐规则排版:
- 生成两个随机乘数后,先计算最终乘积,取最终乘积的字符串长度作为整道竖式的对齐宽度
- 被乘数、乘数、中间乘积、最终结果全部按右对齐规则补前置空格
- 逐位计算中间乘积时,每高一位的计算结果末尾补对应数量的
×占位,前置空格数 = 总对齐宽度 - 当前中间乘积的字符串长度 - 末尾×的数量,保证数字部分始终右对齐
修复后完整代码
import java.lang.Math.*; class Mainto { public static void main (String[] args) { // 输出和控制台的间距 System.out.println(); // 生成6位被乘数 long num1 = (long)(Math.random()*(999999-100000+1)+100000); // 生成2-3位乘数 long num2 = (long)(Math.random()*(999-10+1)+10); long finalResult = num1 * num2; // 统一对齐宽度:取最终乘积的长度 int alignWidth = String.valueOf(finalResult).length(); // 分隔线长度适配对齐宽度 String splitLine = "-".repeat(alignWidth + 10); // 打印题目头部,统一右对齐 System.out.printf("%" + alignWidth + "d%n", num1); System.out.printf("×%" + (alignWidth -1) + "d%n", num2); System.out.println(splitLine); // 逐位计算中间乘积并对齐输出 long mul = num2; int xCount = 0; while(mul != 0){ long d = mul % 10; long partial = d * num1; int partialLen = String.valueOf(partial).length(); // 计算前置空格数 int leadingSpace = alignWidth - partialLen - xCount; // 拼接输出:前置空格 + 中间乘积 + 末尾占位× System.out.println(" ".repeat(leadingSpace) + partial + "×".repeat(xCount)); mul /= 10; xCount++; } // 打印最终结果 System.out.println(splitLine); System.out.printf("%" + alignWidth + "d%n", finalResult); System.out.println(splitLine); // 题末间距 System.out.println(); System.out.println(); } }
修复后输出效果(对应示例数值850702×841)
850702 × 841 ------------------- 850702 3402808× 6805616×× ------------------- 715440382 -------------------
该逻辑适配所有随机生成的合法位数乘数,不会出现错位问题,完全匹配老式手写竖式的排版习惯。
内容的提问来源于stack exchange,提问作者Adarshyodha
相关产品推荐
相关产品推荐

