Класс “Рациональные числа”

Сделаем класс Rational, это рациональные числа, для которых хранится их числитель и знаменатель. С рациональными числами можно совершать арифметические операции.

  1. Создайте класс и добавьте поля n и d (numerator, denominator - числитель, знаменатель). Убедитесь, что поля приватные.
  2. Класс должен иметь конструкторы вида Rational(3, 2) и Rational(3).
  3. Добавьте метод public String toString(), который возвращает естественное представление числа в виде строки, например, 5/7. Если знаменатель равен 1, его не нужно писать. Если числитель ноль, то “0”, а не “0/2” и т.п.
  4. Добавьте метод double toDouble(), который возвращает значение в виде double.
  5. Добавьте сокращение дроби в конструктор: поделить числитель и знаменатель на НОД, убедиться, что знаменатель положительный.
  6. Арифметические функции. add, sub, mul, div:

     Rational r1 = r2.add(r3); // создает новое число
     r2.addInPlace(r3); // добавляет к r2 и изменяет его
    

    Протестируйте! Проверьте, например, что \(\frac16 + \frac13 = \frac12\), и проверьте другие аналогичные равенства для других арифметических операций.

  7. Создайте функцию не в Rational, которая по n считает \(1 + \frac12 + \frac13 + \frac14 + \frac15 + … + \frac1n\) Проверьте, что f(1) = 1, f(2) = 1.5, f(3) = 1.833333333333333
  8. Чему равно f(20)? Почему оно равно тому, чему равно? Как исправить?
  9. Добавьте get- методы для числителя и знаменателя. Чтобы Rational стал совсем неизменяемым, закомментируйте методы *InPlace().
  10. Создайте статические константы ONE и ZERO типа Rational, хранящие элементы 0, 1 в виде рациональных чисел.
  11. Сделайте статическим метод поиска НОД (или сокращения)
  12. Создайте статические версии арифметических операций: static Rational add(Rational r1, Rational r2) и т.п. Эти операции создают новое число, вы можете переиспользовать старые арифметические операции.
  13. (*) Решите аналогичную задачу про комплексные числа. Они хранятся в виде вещественной и мнимой части.