vetalil18
@vetalil18
Начинающий front-end developer

Деление в столбик java?

Нужно реализовать деление в столбик

Не знаю с какой стороны подойти, можете расписать алгоритм действий?
  • Вопрос задан
  • 2216 просмотров
Пригласить эксперта
Ответы на вопрос 2
1. Возьмите 2 числа.
2. Поделите одно на другое в столбик на листике.
3. Запишите действия
4. Подумайте над ними
Ответ написан
@bedward70
Хорошая задачка. Вот что получилось:
public class AppDivide {
    public static void main(String[] args) throws Exception {

        /** Делимое */
        int dividend = 554223;
        /** Делитель */
        int divider = 11;

        divide(dividend, divider);
    }

    private static void divide(int dividend, int divider) throws Exception {
        validate(dividend);
        validate(divider);

        // Находим мин длину для отображения (+1 - это для знака минус)
        int maxLen = 1 + Math.max(Integer.valueOf(dividend).toString().length(), Integer.valueOf(divider).toString().length());
        String intFormat = "%" + maxLen + "d";
        System.out.println(generateTab(maxLen + maxLen + 2, '='));
        System.out.println(" " + String.format(intFormat, dividend) + "|" + String.format(intFormat, divider));

        int result = 0;
        while (true) {

            // Найти следующую цифру
            Num num = divideNext(dividend, divider);
            if (num.getDigit() == 0) {
                break;
            }

            // Вывод вычитаемого значения и полученной цифры
            String numFormat = "%" + (maxLen - num.getPointPosition()) + "d";
            System.out.println(" " + String.format(numFormat, -divider * num.getDigit()) + generateTab(num.getPointPosition(), ' ') + "|" + String.format(numFormat, num.getDigit()));

            // Модифицирование остатка и сохранение в результат
            result += num.getValue();
            dividend -= num.getValue() * divider;

            // Вывод линии и остатка
            System.out.println(generateTab(maxLen + maxLen + 2, '-'));
            System.out.println(" " + String.format(intFormat, dividend) + "|" );

        }

        // Вывод остатка и результата
        System.out.println(generateTab(maxLen + maxLen + 2, '='));
        System.out.println(" " + String.format(intFormat, dividend) + "|" + String.format(intFormat, result));
    }

    private static Num divideNext(int dividend, int divider) {
        int pointPosition = 0;
        if (dividend < divider) {
            return new Num(0,0);
        }
        while(dividend > divider * 10) {
            pointPosition ++;
            divider *= 10;
        }
        int count = 1;
        while(dividend > divider * (count + 1)) {
            count ++;
        }
        return new Num(count, pointPosition);
    }

    private static String generateTab(int length, char ch) {
        StringBuilder result = new StringBuilder();
        for (int i = 0 ; i < length; i++) {
            result.append(ch);
        }
        return result.toString();
    }

    private static void validate(int value) throws Exception {
        if (value < 0) {
            throw new Exception("Validation error: " + value);
        }
    }

     private static class Num {

         private final int digit;
         private final int pointPosition;

         public Num(int value, int pointPosition) {
             this.digit = value;
             this.pointPosition = pointPosition;
         }

         public int getDigit() {
             return digit;
         }

         public int getPointPosition() {
             return pointPosition;
         }

         public int getValue() {
             int result = digit;
             for (int i = 0; i < pointPosition; i++) {
                 result *= 10;
             }
             return result;
         }
     };
}


Вот как выглядит результат:
================
  554223|     11
 -55    |  5
----------------
    4223|
   -33  |    3
----------------
     923|
    -88 |     8
----------------
      43|
     -33|      3
----------------
      10|
================
      10|  50383
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы