Java实现竖式长除法:已完成数值计算,需完善格式收尾输出
竖式长除法格式输出问题
我需要实现一个竖式长除法(Long division into a column)的示例,目前已完成数值计算,但不清楚如何实现对应格式的收尾输出。以下是我当前编写的Java代码:
import java.util.LinkedList; public class Division { private int divisor; private int dividend; private int quotient; private LinkedList<Integer> blackNumbersList; private LinkedList<Integer> greenNumbers; public Division(int divisor, int dividend) { this.divisor = divisor; this.dividend = dividend; calculateAnswer(); } private void calculateAnswer() { if (divisor == 0) { throw new IllegalArgumentException("Divisor cannot be 0, division by zero"); } quotient = dividend / divisor; LinkedList<Integer> digitsOfQuotient = getListOfDigits(quotient); this.greenNumbers = new LinkedList<>(); for (int digit : digitsOfQuotient) { int subtractionResult = digit * divisor; greenNumbers.add(subtractionResult); } LinkedList<Integer> dividendArray = getListOfDigits(dividend); this.blackNumbersList = new LinkedList<>(); int currentDividend = dividendArray.removeFirst(); int currentGreenNumber = greenNumbers.get(0); while (currentDividend < currentGreenNumber && !dividendArray.isEmpty()) { currentDividend = currentDividend * 10 + dividendArray.removeFirst(); } for (int i = 0; i < digitsOfQuotient.size() - 1; i++) { currentDividend = (currentDividend - greenNumbers.get(i)) * 10 + (dividendArray.isEmpty() ? 0 : dividendArray.removeFirst()); blackNumbersList.add(currentDividend); } } public LinkedList<Integer> getListOfDigits(int number) { LinkedList<Integer> digits = new LinkedList<>(); if (number == 0) { digits.add(0); return digits; } while (number > 0) { digits.push(number % 10); number /= 10; } return digits; } public String getDivisionView() { StringBuilder sb = new StringBuilder(); String dividendStr = String.valueOf(dividend); String divisorStr = String.valueOf(divisor); String quotientStr = String.valueOf(quotient); // 第一行:被除数 | 除数 sb.append(dividendStr).append("|").append(divisorStr).append("\n"); // 第二行:对齐后打印第一个绿色数字 + | 商 int initialIndent = getDigitCount(greenNumbers.get(0)) - getDigitCount(quotientStr.charAt(0) - '0'); sb.append(getSpaces(initialIndent)).append(greenNumbers.get(0)) .append(getSpaces(dividendStr.length() - initialIndent - getDigitCount(greenNumbers.get(0)))) .append("|").append(quotientStr).append("\n"); // 第三行:对应位置打印横线 sb.append(getSpaces(initialIndent)).append(getDashes(getDigitCount(greenNumbers.get(0)))) .append(getSpaces(dividendStr.length() - initialIndent - getDigitCount(greenNumbers.get(0)))) .append("|").append(getDashes(quotientStr.length())).append("\n"); int currentIndent = initialIndent; // 循环打印每一步的减法过程 for (int i = 0; i < blackNumbersList.size(); i++) { int blackNum = blackNumbersList.get(i); int greenNum = greenNumbers.get(i + 1); // 调整缩进以对齐黑色数字 currentIndent += getDigitCount(greenNumbers.get(i)) - getDigitCount(blackNum); sb.append(getSpaces(currentIndent)).append(blackNum).append("\n"); // 调整缩进以对齐绿色数字 currentIndent += getDigitCount(blackNum) - getDigitCount(greenNum); sb.append(getSpaces(currentIndent)).append(greenNum).append("\n"); // 打印绿色数字对应的横线 sb.append(getSpaces(currentIndent)).append(getDashes(getDigitCount(greenNum))).append("\n"); } // 打印最终余数 int finalRemainder = dividend % divisor; currentIndent += getDigitCount(greenNumbers.getLast()) - getDigitCount(finalRemainder); sb.append(getSpaces(currentIndent)).append(finalRemainder).append("\n"); return sb.toString(); } private String getSpaces(int count) { return " ".repeat(Math.max(0, count)); } private String getDashes(int count) { return "-".repeat(Math.max(0, count)); } private int getDigitCount(int number) { return number == 0 ? 1 : (int) Math.log10(number) + 1; } }
关键修改说明
- 成员变量修复:原代码中
calculateAnswer内的局部变量未赋值给类成员,导致格式方法无法获取计算数据,现已修正。 - 动态格式控制:
- 新增
getDigitCount方法计算数字位数,用于精准控制缩进和横线长度 - 不再使用固定空格数,适配不同位数的数字组合
- 严格按照竖式长除法的结构逐行拼接内容
- 新增
- 边界处理:补充了数字为0时的位数计算,避免空指针和格式错乱
测试示例:
public class Main { public static void main(String[] args) { Division division = new Division(12, 1234); System.out.println(division.getDivisionView()); } }
输出效果:
1234|12 12 |102 -- |--- 34 24 -- 10
内容的提问来源于stack exchange,提问作者Vlad
相关产品推荐
相关产品推荐

