找到算法来计算具有给定区域x
的矩形的维度y
和N
,以便N ⩽ x*y ⩽ N+2
以及x
和{ {1}}接近形成一个正方形。
一些例子:
y
查看N = 100
和x
,y
而100 ⩽ x*y ⩽ 102
和x
之间的差异也很小
⟹
y
和x = 10
y = 10
N = 99
和x = 10
,y = 10
和100 ⩽ x*y ⩽ 102
;
x-y = 0
N = 19
和x = 5
,y = 4
和19 ⩽ x*y ⩽ 21
;
我的回答:
首先检查x-y = 1
,N
或N+1
是否为正方形。如果
然后任何N+2
是它的平方根。
否则,找到x = y
的平方根和
N
。
现在将x = y = sqrt(N)
或x
增加1并检查是否符合y
条件。
答案 0 :(得分:1)
我们从最佳实际解决方案x=y=sqrt(N)
开始。我们将此解决方案更改为最接近的整数参数化并进行调整,直到满足条件。在不失一般性的情况下,我们假设x
是两个值中较小的一个:
int x, y;
x = y = (int)Math.Round(Math.Sqrt(N + 1));
while(x * y < N || x * y > N + 2)
{
if (x * y > N + 2)
--x;
else
++y;
}
前20个值是:
N = 1: (1, 1)
N = 2: (2, 2)
N = 3: (2, 2)
N = 4: (2, 2)
N = 5: (2, 3)
N = 6: (2, 3)
N = 7: (3, 3)
N = 8: (3, 3)
N = 9: (3, 3)
N = 10: (3, 4)
N = 11: (3, 4)
N = 12: (3, 4)
N = 13: (3, 5)
N = 14: (4, 4)
N = 15: (4, 4)
N = 16: (4, 4)
N = 17: (3, 6)
N = 18: (4, 5)
N = 19: (4, 5)
N = 20: (4, 5)
答案 1 :(得分:0)
x
和y
设置为N
x
和y
舍入到ceil,例如x
为9.1,x
为10 x
* y
总是会大于或等于N,检查是否N + 2&gt; = x
* y
然后您找到了{{ 1}}和x
,如果没有,请转到4 y
减少一个,因此x
为x - 1
,x
为y
y
将永远是真实的
答案 2 :(得分:0)
我假设N,x和y必须是整数。解决该问题的一种方法是将N,N + 1,N + 2中的每一个分解为两个因子x和y,使得x-y最小化。 N,N + 1,N + 2中的至少一个是复合的(如果N> 1),因此您可以保证得到比y = 1更好的东西。不过,你必须做3 * floor(sqrt(N + 2))试验分区,所以这个算法并不快。
你想从y = floor(sqrt(N + 2))向后工作,这样你就可以在找到答案时停下来。一旦你找到了答案,你可能想再多走一步,看看你是否能找到更好的答案,也许(如果N很小)。