Класс изменяемых рациональных дробей

Задача

Напишите класс для работы с изменяемыми (mutable) рациональными дробями, подготовьте для него интерфейс.

Тесты

Входные данные: четыре целых числа — числитель и знаменатель дроби F1, числитель и знаменатель  дроби F2

Выходные данные: результаты сравнения, сложения, вычитания, умножения, деления дробей F1 и F2

Входные данные Дробь F1 Дробь F2 Сравнение F1 и F2 F1+F2 F1-F2 F1*F2 F1/F2
1 1 2 2 3 1/2 2/3 1/2<2/3 7/6 -1/6 1/3 3/4
2 4 16 3 -5 1/4 -3/5 1/4>-3/5 -7/20 17/20 -3/20 -5/12
3 1 7 2 14 1/7 1/7 1/7=1/7 2/7 0/1 1/49 1/1
4 2 4 0 4 1/2 0/1 1/2>0/1 1/2 1/2 0/1 Error

Код

Код доступен на ideone

Пояснение

Класс Arithmetics содержит метод для вычисления НОД  public static int gcd(int a, int b).

Класс  Fraction  предназначен для работы с изменяемыми дробями. Его методы предосталяют возможность выполнять такие действия с дробью:

  • получить значение числителя (метод public int getNumerator()) и знаменателя (метод public int getDenominator());
  • задать значение (методы  public void setValue() с различными параметрами) числителем и знаменателем (параметры  int n, int d, целым числом (параметр  int n) или другой дробью (параметр  Fraction f);
  • прибавить, отнять, умножить на, разделить на дробь или целое число (методы  public void  add(), substract(), multiply()divide() с параметрами  Fraction f или int n;
  • сравнить с другой дробью (методы  public boolean equals() и  public int compareTo();
  • получить строковое представление дроби (метод  public String toString().

ML36. Движение катера

Условие задачи

Катер движется по течению реки из пункта A в пункт B и обратно с собственной скоростью $latex v$ км/час. Скорость течения постоянна — $latex u$ км/час. Расстояние между пунктами составляет $latex s$ км. Для любых действительных неотрицательных значений расстояния и скоростей вычислить время в пути $latex t_{boat}$.

Тесты

Входные данные: физические величины $latex v$, $latex u$, $latex s$

Выходные данные: физическая величина $latex t_{boat}$

Входные данные Выходные данные
1 3 2 10 12.0
2 1.4 0.4 3.6 5.6
3 3 6 10 Infinity
4 2 1 0 0.0

Код

Код доступен на ideone

Пояснение

Скорость катера, когда он идет по течению, равна $latex (v+u)$, а когда против — $latex (v-u)$. Время $latex t$ вычисляется по формуле $latex t = \frac{s}{v}\\ $, где $latex s$ — расстояние, $latex v$ — скорость, соответственно общее время  пути катера составит  $latex t_{boat} = {\frac{s}{v+u}\\+\frac{s}{v-u}\\} $. При этом время — величина неотрицательная, а делитель дроби не должен быть нулевым, соответственно имеем ограничение $latex v-u > 0, v > u $.

 

Класс рациональных дробей

Задача

Напишите класс для работы с не изменяемыми (immutable) рациональными дробями используя статические методы.

Код

Код на Ideone.

Тест

Входящие данные Операция Выходящие данные
4/5

1/2

проверка равенства false
4/5

1/2

2/5

сравнение по равенству дроби и произведения двух других true
2/5

1/2

сложение 9/10
4/5

1/2

вычитание 3/10
4/5

1/2

вычитание -3/10
2/5

1/2

умножение 1/5
4/5

1/2

деление 8/5
4/5

1/2

сравнение 4/5 > 1/2
4/5

1/2

сравнение 1/2 > 2/5
4/5

1/2

2/5

сравнение дроби и произведения двух других 2/5 = 2/5

 

Immutable fractions

Задание

Создайте класс для выполнения основных операций с дробями. В данном варианте дроби не должны изменяться после создания, а методы, реализующие арифметические операции должны быть статическими. Реализуйте метод для автоматического получения строкового представления дроби при печати. Протестируйте своё решение в методе main().
Желательно реализовать метод сокращения дробей через алгоритм Евклида для поиска наибольшего общего делителя (НОД, GCD). Вполне уместной было бы реализовать в этом классе интерфейс Comparable и продемонстрировать работу метода java.util.Arrays.sort().

Решение