Коли ви перетворюєте дріб у десяткове число і хочете зберегти це число, вам часто доводиться округляти його, оскільки ви хочете використовувати лише певну кількість пам'яті. Скажімо, ви можете зберігати лише 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). Але я гадаю, що сортування кожного випадку окремо краще, ніж не допускати функціональних мов.