Напишите программу или функцию, в которой заданы два целых числа a, b, и выведет строку, содержащую десятичное число, точно представляющее дробь a / b .
Если a / b является целым числом, просто выведите значение без десятичной точки или начальных нулей:
123562375921304812375087183597 / 2777 -> 44494913907563850333124661
81 / 3 -> 27
-6 / 2 -> -3
Если a / b не является целым числом, но имеет конечное представление в основании 10, выведите значение без начальных или конечных нулей (кроме одного нуля перед точкой):
1 / 2 -> 0.5
3289323463 / -250000000 -> -13.157293852
Наконец, если и только если (а значит, нет 0.999...
) a / b не является целым числом и не имеет конечного представления, выведите конечную часть, за которой следует повторяющаяся часть в скобках. Повторяющаяся часть должна быть как можно меньше и начинаться как можно раньше.
-1 / 3 -> -0.(3)
235 / 14 -> 16.7(857142)
123 / 321 -> 0.(38317757009345794392523364485981308411214953271028037)
355 / 113 -> 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)
Ваша программа должна работать для всех приведенных выше примеров менее чем за 10 секунд на современном настольном ПК. Наименьшая программа в байтах побеждает.
Ответы:
Perl 6 ,
63 5850 байтПопробуй это
Если вам все равно, что он будет работать только с знаменателями, которые вписываются в 64-битное целое число, его можно сократить до 43 байтов:
Expanded:
источник
Python 2, 174 байта
Я не совсем уверен в правильности этого ответа, но он сработал для тестовых случаев, описанных выше, и для других тестовых случаев, которые я выбрасывал. Это похоже на правильный беспорядок, так что я уверен, что есть много места для игры в гольф.
Первоначальная установка принимает абсолютные значения обоих аргументов, чтобы гарантировать, что мы имеем дело с неотрицательными числами (сохраняя вычисление знака на потом), и делегирует факторную часть результата в арифметику произвольной точности Python. Дробная часть выполняется с помощью алгоритма деления начальной школы, пока мы не получим повторение в оставшейся части. Затем мы смотрим вверх, когда в последний раз видели это повторение, чтобы получить точку, и строим строку соответствующим образом.
Обратите внимание, что алгоритм на самом деле довольно медленный из-за
in
операции O (n) , но он достаточно быстр для примеров.источник
Пакет,
349344 байтаИзменить: 5 байтов, удалив ненужные символы. "Ungolfed":
источник
set /a
.Ява,
625605Гольф-код:
Примечание: я считаю статический импорт частью функции для игры в гольф.
Эта функция начинается с получения результата деления. Это добавляет неотъемлемую часть и знак, если необходимо. Затем, если есть остаток, он выполняет базовое 10 длинное деление. На каждом шаге выполняйте деление. Сохраните вычисленную цифру и остаток в двух списках. Если мы снова встретимся с той же цифрой и остатком, есть повторяющаяся часть, и мы знаем, с какого индекса она начинается. Код либо добавляет цифры (без повторов), либо цифры перед повторением, а затем повторяющиеся цифры, заключенные в скобки.
Это немного большой в основном из-за
BigInteger
. Если входы не переполняются дажеlong
тогда, это может быть немного короче. Тем не менее, я ожидаю, что есть способы улучшить эту запись.Разобранный код с основным методом для тестирования:
Выход программы:
источник
a, BigInteger
. Я также думаю, что вы могли бы псевдонимBigInteger.TEN
иBigInteger.ZERO
.while (true)
->,for (;;)
которые также позволили мне поместить материал вfor
инициализатор, сохранив еще один байт.BigInteger
в моем коде есть восемь экземпляров текста , и я не вижу, как окупится добавление большего количества кода для сокращения их до имени класса из одного символа. И, конечно, добавление кода для решенияint[]
(что BigInteger уже делает внутренне) только раздувает мой ответ.BigInteger
метод, который я вызываю для возврата экземпляра подкласса, мне нужно будет добавить несколько приведений, которые еще больше раздувают код. Вдобавок к потраченным впустую байтам на служебные данные подкласса, это конечно увеличило бы размер кода.PHP, 277 байт
источник
Mathematica 198 байтов
UnGolfed
тесты
{"27", "-27", "0,25", "-4. (3)", "2. (714285)", "131572.93852", "16,7 (857142)", "94,6 (428571)"}
источник