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

Задача

Напишите класс для работы с изменяемыми (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().

e-olymp 912. Количество предложений

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

Задача взята с сайта e-olymp

Определить количество предложений в заданном фрагменте текста на английском языке, количество символов в котором не превышает 250. Гарантируется, что в тексте отсутствуют тире, дефисы, цифры и числа.

Тесты

Входные данные: строка — фрагмент текста

Выходные данные: количество предложений в заданной строке

Входные данные Выходные данные
1 Hello World! 1
2 Don’t fall in love with programming languages: they hurt 0
3 Is this a string!? This string… 2
4 Winter. Winter? Winter! 3

Код

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

Результаты проверки доступны на e-olymp

Пояснение

Для хранения заданной строки будем использовать переменную  string типа  String, которая будет проинициализирована значением из стандартного потока ввода, а для хранения результата — переменную sentenceCount  типа int , которую проинициализируем числом 0. Переменные объявляются в начале программы.

Каждое предложение может заканчиваться точкой, восклицательным знаком или вопросительным знаком, или же комбинацией этих символов (например, многоточием). Для анализа строки воспользуемся средствами для работы с регулярными выражениями. Для хранения шаблона, по которому будет производиться поиск, используется класс  Pattern, переменной типа которого присваивается шаблон, получаемый из строки-регулярного выражения с помощью статического метода этого класса Pattern.compile() . В данном случае переменная  pattern инициализируется шаблоном, получаемым из регулярного выражения [.!?]+, которое соответствует условиям задачи

Для того, чтобы произвести сравнение строки с шаблоном, используется класс  Matcher, переменной типа которого нужно присвоить возвращаямое значение метода  match() класса Pattern , который принимает строку. Для подсчета количества предложений воспользуемся методом find() класса  Matcher, который проверяет, есть ли далее в данной строке подстрока, соответствующая заданному шаблону, и возвращает  true , если подстрока найдена, или  false , если нет. Подсчет количества предложений производится путем вызова данного метода в цикле до тих пор, пока он не вернет  false — результатом подсчета будет количество итераций цикла.

Результат работы программы — вывод значения переменной sentenceCount.

 

 

A302. Количество различных цифр числа в его десятичной записи

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

Дано натуральное число $latex N$. Сколько различных цифр встречается в его десятичной записи?

Тесты

Входные данные: натуральное число $latex N$

Выходные данные: количество различных цифр в десятичной записи числа $latex N$

Входные данные Выходные данные
1 1234567890 10
2 43352 4
3 10101 2
4 1 1

Код

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

Пояснение

Для хранения заданного числа $latex N$ будем использовать переменную  n  типа long, которая будет проинициализирована значением из стандартного потока ввода, а для хранения результата — переменную differentDigitsCount  типа int, которую проинициализируем числом 0. Переменные объявляются в начале программы. Для определения количества различных цифр будем использовать массив типа int из 10 элементов, где каждый элемент будет соответствовать количеству вхождений одной из цифр в заданное число . Элементы массива инициализируются числом 0 по умолчанию. В цикле поочередно определяется разряд — последний разряд числа, и соответствующий элемент массива инкрементируется, затем это число разделяется на 10, чтобы «отбросить» последний разряд. Результат работы программы — вывод значения переменной  differentDigitsCount, которое получается путем подсчета ненулевых элементов массива в цикле.

 

 

MS2. Сумма чисел в потоке

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

Сосчитать сумму чисел во входном потоке.

Тесты

Входные данные: поток чисел

Выходные данные: сумма чисел в потоке

Входные данные Выходные данные
1 1 2 4 7.0
2 0 0 0 -3 -3.0
3 12.4 25.545 37.945
4 -4.34 3.764 2.3 1.724

Код

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

Пояснение

В начале программы обьявим переменные типа doublex  для хранения текущего значения и  sum  для хранения суммы, проинициализированную числом 0. Сумма будет аккумулироваться в переменной  sum путем последовательного сложения значения этой переменной со значением текущего элемента до тех пор, пока в потоке имеется значение, что проверяется с помощью метода  hasNext()  класса  Scanner. Результат работы программы — вывод значения переменной sum.

 

 

D2574. Сумма ряда

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

Найти сумму сходящегося ряда $latex \sum\limits_{i=1}^n \frac{\sin ix}{2^i}.$

Тесты

Входные данные: $latex n$ — количество шагов, $latex x$ — значение $latex x.$

Выходные данные: сумма ряда $latex \sum\limits_{i=1}^n \frac{\sin ix}{2^i}.$

Входные данные Выходные данные Тесты на WolframAlpha
1 10 0.523598 0.6511697 Тест 1
2 5 1.141592 0.5300871 Тест 2
3 15 1.570796 0.399994 Тест 3
4 10 -2.3 -0.1944212  Тест 4

Код

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

Пояснение

В начале программы объявим переменные типа  intn для хранения шагов и  powOf2, проинициализированную числом 1, так как в ней будет храниться текущая степень числа 2, полученная путем последовательного умножения значения данной переменной на 2; и переменные типа  doublex для хранения значения $latex x$ и  sum для хранения суммы, проинициализированную числом 0. Проинициализируем переменные  n  и  x  значениями из стандартного потока ввода. Сумма вычисляется в цикле и аккумулируется в переменной  sum , используя стандартную функцию вычисления синуса  Math.sin() и значение переменной  powOf2. Результат работы программы — вывод значения переменной sum.

 

e-olymp 923. Время года

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

Задача взята с сайта e-olymp

Определить название времени года по заданному номеру месяца, используя составные условия.

Тесты

Входные данные: одно число — номер месяца

Выходные данные: для весенних месяцев вывести Spring, для летних — Summer, для осенних — Autumn и для зимних — Winter

Входные данные Выходные данные
1 12 Winter
2 5 Spring
3 7 Summer
4 10 Autumn

Код

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

Результаты проверки доступны на e-olymp

Пояснение

Для хранения номера месяца будем использовать переменную  monthNumber типа  int, а для хранения названия времени года — переменную seasonName  типа String. Обьявим эти переменные в начале программы. Проинициализируем переменную  monthNumber значением из стандартного потока ввода. Переменную  seasonName проинициализируем значением, которое определяется с помощью тернарных операторов, с помощью которых поочередно проверяется соответствие значения переменной  monthNumber  определенному времени года: если остаток от деления номера месяца на 12 будет меньше, чем 3, то переменная будет проинициализирована значением «Winter»; если номер месяца меньше, чем 6 — значением «Spring» ; если меньше, чем 9 — значением «Summer»; значением «Autumn» в иных случаях. Результат работы программы — вывод значения переменной  seasonName.

 

 

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 $.