Класс “Рациональные числа”
Сделаем класс Rational, это рациональные числа, для которых хранится их числитель и знаменатель. С рациональными числами можно совершать арифметические операции.
- Создайте класс и добавьте поля n и d (numerator, denominator - числитель, знаменатель). Убедитесь, что поля приватные.
- Класс должен иметь конструкторы вида
Rational(3, 2)
иRational(3)
. - Добавьте метод
public String toString()
, который возвращает естественное представление числа в виде строки, например,5/7
. Если знаменатель равен 1, его не нужно писать. Если числитель ноль, то “0”, а не “0/2” и т.п. - Добавьте метод double toDouble(), который возвращает значение в виде double.
- Добавьте сокращение дроби в конструктор: поделить числитель и знаменатель на НОД, убедиться, что знаменатель положительный.
-
Арифметические функции. add, sub, mul, div:
Rational r1 = r2.add(r3); // создает новое число r2.addInPlace(r3); // добавляет к r2 и изменяет его
Протестируйте! Проверьте, например, что \(\frac16 + \frac13 = \frac12\), и проверьте другие аналогичные равенства для других арифметических операций.
- Создайте функцию не в Rational, которая по n считает \(1 + \frac12 + \frac13 + \frac14 + \frac15 + … + \frac1n\) Проверьте, что f(1) = 1, f(2) = 1.5, f(3) = 1.833333333333333
- Чему равно f(20)? Почему оно равно тому, чему равно? Как исправить?
- Добавьте get- методы для числителя и знаменателя. Чтобы Rational стал совсем неизменяемым, закомментируйте методы
*InPlace()
. - Создайте статические константы ONE и ZERO типа Rational, хранящие элементы 0, 1 в виде рациональных чисел.
- Сделайте статическим метод поиска НОД (или сокращения)
- Создайте статические версии арифметических операций:
static Rational add(Rational r1, Rational r2)
и т.п. Эти операции создают новое число, вы можете переиспользовать старые арифметические операции. - (*) Решите аналогичную задачу про комплексные числа. Они хранятся в виде вещественной и мнимой части.