Когда вы преобразуете дробь в десятичное число и хотите сохранить это число, вам часто приходится округлять его, потому что вы хотите использовать только определенный объем памяти. Допустим, вы можете хранить только 5 десятичных цифр, тогда 5/3 становится 1,6667. Если вы можете сохранить только 2 десятичных знака, это будет 1.7 (теперь предполагается, что оно всегда между 0 и 9.99 ...).
Если вы сейчас попытаетесь повернуть этот процесс в обратном порядке с 1,7 и хотите вернуть свою дробь, это может быть затруднительно, поскольку вы знаете, что 1,7 - это только округленное число. Конечно, вы можете попробовать 17/10, но это довольно «уродливая» фракция по сравнению с «элегантной» 5/3.
Таким образом, цель теперь состоит в том, чтобы найти дробь a / b с наименьшим знаменателем b, которая приводит к округленному десятичному числу при правильном округлении.
Детали
Входные данные содержат строку с числом от 1 до 5 цифр от 0 (включая) до 10 (не включая) с символом «.» после первой цифры. Допустим, n
обозначает количество цифр. Выходными данными должен быть список / массив из двух целых чисел [numerator, denominator]
или рациональный тип данных (вы можете создать свой собственный или использовать встроенный), где числитель неотрицательный, а знаменатель положительный. Числитель / знаменатель дроби должен быть равен вводу при правильном округлении до n
цифр (что означает n-1
цифры после десятичной точки).
Ограничение: допустимо только одно утверждение цикла. Это означает, что вы можете использовать только один единственный оператор зацикливания (например, for
или while
или goto
и т. Д., А также функциональные циклы, например map
или fold
применяющие код к каждому элементу списка / массива) во всем коде, но вы можете свободно его использовать или используйте рекурсию и т. д.
Вы должны написать функцию. Если у вашего языка нет функций (или даже если он есть), вы можете альтернативно предположить, что входные данные хранятся в переменной (или вводить через stdin), и распечатать результат или записать его в файл. Наименьшее количество байтов побеждает.
округление
Округление должно соответствовать «обычным» правилам округления, т. Е. Если последняя цифра, которая будет обрезана, равна 5 или больше, вы округлите число вверх и округлите значение для других случаев, например:
4.5494 будет результатом округления до
- 1 цифра: 5
- 2 цифры: 4,5
- 3 цифры: 4,55
- 4 цифры: 4,549
Примеры
Пожалуйста, включите следующие тестовые примеры и другие «интересные»:
Input 1.7 Output 5/3
Input 0. Output 0/1
Input 0.001 Output 1/667
Input 3.1416 Output 355/113
for n in numbers: f(g(n))
эквивалентно map(f, map(g, numbers))
. Функциональная версия использует map
дважды, это действительно должно быть запрещено?
repeat
создается бесконечный список аргументов. Кажется, что это цикл, но на самом деле он имеет временную сложность O (1). Но я думаю, лучше сортировать каждый случай отдельно, чем не использовать функциональные языки.