Вызов
Оригами (складная бумага) - это творческий вид искусства. Насколько я знаю, мастер оригами предпочитает квадратную бумагу. Начнем с начала - конвертируем прямоугольную бумагу в квадратную.
Таким образом, бумага делится на квадраты. Мы удаляем самый большой квадрат, который разделяет один более короткий край с текущей формой, шаг за шагом (см. Рисунок ниже). И если оставшаяся часть после одного шага меньше или равна 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.

