Вызов
Оригами (складная бумага) - это творческий вид искусства. Насколько я знаю, мастер оригами предпочитает квадратную бумагу. Начнем с начала - конвертируем прямоугольную бумагу в квадратную.
Таким образом, бумага делится на квадраты. Мы удаляем самый большой квадрат, который разделяет один более короткий край с текущей формой, шаг за шагом (см. Рисунок ниже). И если оставшаяся часть после одного шага меньше или равна 0.001 * (area of the original paper)
, бумага не может быть разделена дальше. Возможно, что в конце концов ничего не останется.
Ваша задача - подсчитать, сколько квадратов сделано в процессе. Квадрат на последнем шаге, который не позволяет разделить бумагу, засчитывается в результат.
Пример (бумага 1.350
ширины / высоты), вывод 10:
Вход и выход
Ввод: отношение ширины к высоте для прямоугольной бумаги, один десятичный знак (или целое число без точки) от 1.002
до 1.999
с минимальным шагом 0.001
. Вы также можете использовать любой другой разумный формат, описывающий соотношение. Просто упомяните это в своем ответе.
Вывод: квадратное число, одно целое число.
Пример ввода / вывода
Формат отображения используется для поддержания чистоты страницы, в то время как ваш код не должен поддерживать ввод списка или быть функцией отображения.
1.002 => 251
1.003 => 223
1.004 => 189
1.005 => 161
1.006 => 140
1.007 => 124
1.008 => 111
1.009 => 100
Спасибо @LuisMendo, вот график ответов.
замечания
- Это код-гольф, поэтому выигрывает самый короткий код
- Обратите внимание на стандартные лазейки
- Вы можете сами решать, что делать с вводом и выводом, но они должны следовать стандартным ограничениям.
Кстати...
- Прокомментируйте, если у вас есть что-то неясное по поводу проблемы
- Лично я бы предложил, чтобы ваш ответ содержал объяснение, если вы используете язык игры в гольф
- Спасибо @GregMartin, прочитайте его ответ для хорошего математического объяснения проблемы.
Пример кода
Вот незакрашенная версия кода C ++:
#include <iostream>
#include <utility>
int f (double m)
{
double n = 1, k = 0.001;
int cnt = 0;
k *= m; // the target minimum size
while(m*n >= k)
{
m -= n; // extract a square
if(n > m)
std::swap(n, m); // keep m > n
++ cnt;
}
return cnt;
}
int main()
{
double p;
std::cin >> p;
std::cout << f(p);
return 0;
}
Все вычисления, относящиеся к примеру кода, требуют точности 6 десятичных цифр, которая покрыта float
.