给定N找到x和y使得N⩽x*y⩽N+ 2和| x-y |是最小的

时间:2015-05-30 13:44:16

标签: algorithm

找到算法来计算具有给定区域x的矩形的维度yN,以便N ⩽ x*y ⩽ N+2以及x和{ {1}}接近形成一个正方形。

一些例子:

  • y
    查看N = 100xy100 ⩽ x*y ⩽ 102x之间的差异也很小 ⟹ yx = 10

  • y = 10
    N = 99x = 10y = 10100 ⩽ x*y ⩽ 102;

  • x-y = 0
    N = 19x = 5y = 419 ⩽ x*y ⩽ 21;

我的回答:

  1. 首先检查x-y = 1NN+1是否为正方形。如果 然后任何N+2是它的平方根。

  2. 否则,找到x = y的平方根和 N
    现在将x = y = sqrt(N)x增加1并检查是否符合y条件。

3 个答案:

答案 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)

  1. xy设置为N
  2. 的平方根
  3. xy舍入到ceil,例如x为9.1,x为10
  4. x * y总是会大于或等于N,检查是否N + 2&gt; = x * y然后您找到了{{ 1}}和x,如果没有,请转到4
  5. y减少一个,因此xx - 1xy
  6. 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很小)。