You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. 成员变量修复:原代码中calculateAnswer内的局部变量未赋值给类成员,导致格式方法无法获取计算数据,现已修正。
  2. 动态格式控制:
    • 新增getDigitCount方法计算数字位数,用于精准控制缩进和横线长度
    • 不再使用固定空格数,适配不同位数的数字组合
    • 严格按照竖式长除法的结构逐行拼接内容
  3. 边界处理:补充了数字为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:27:04