挑战
折纸(折纸)是一种创造性的艺术形式。据我所知,折纸大师更喜欢方形纸。让我们从头开始-将矩形纸转换为正方形纸。
因此,纸张分为正方形。我们逐步删除与当前形状共有一个较短边的最大正方形(请参见下图)。并且,如果一步之后的剩余部分小于或等于0.001 * (area of the original paper)
,则无法进一步分割纸张。最后可能什么也没剩下。
您的任务是计算在此过程中制作了多少个正方形。使纸张无法分割的最后一步的平方计入输出。
示例(1.350
宽度/高度的纸张),输出为10:
输入输出
输入:矩形纸的宽度/高度比,从1.002
到的十进制数(或不带点的整数),1.999
最小步长为0.001
。您也可以使用任何其他合理的格式来描述比率。只需在您的答案中提及它即可。
输出:平方数,一个整数。
示例I / O
映射格式用于保持页面整洁,而您的代码既不需要支持列表输入,也不需要成为映射功能。
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
。