具有给定整数面积和整数边的最小周长矩形

时间:2012-06-02 09:35:57

标签: geometry integer

给定整数区域A,如何找到矩形的整数边w和h,使得w * h = A且w + h尽可能小?我宁愿算法简单而不是有效(尽管在合理的效率范围内)。

实现这一目标的最佳方法是什么?

找出A的主要因素,然后以某种方式将它们组合起来,试图平衡w和h?找到具有最接近A的区域的整数边的两个正方形然后以某种方式在它们之间进行插值?我没有想到的任何其他方法?

2 个答案:

答案 0 :(得分:2)

你只需要找到:

  • A的最大因子不大于sqrt(A)和
  • A的最小因子不小于sqrt(A)

两者的乘积总是A,因此这些因素是wh

当然,您只需搜索其中一个,因为一旦您w,您只需设置h = A / w

答案 1 :(得分:1)

这是我头顶的一些东西,

w=1; h=A;

开始

然后迭代w,增加它。每增加w后,只要h尝试减少w*h>A。 此外,您还需要某种启发式函数来确定w / h组合的大小。我们称之为size(x,y)

在每一步中,您都必须检查size(w,h)<size(bestW,bestH)是否bestWbestH是您遇到的wh的最佳值远。

size(x,y)的实施情况而言,您可以return x+yreturn Math.abs(x-y)

因为你只需要w&gt; = w并且最初h一直在增加h=A我猜我的复杂性就在某个地方。 O(A/2) <= true complexity <= O(2A)

现在有些伪代码:

w=1;
h=A;

bestW=w;
bestH=h;

while(2*w<=A){
    w++;
    while(w*h>A) {
        h--;
    }
    if(w*h==A && size(w,h)<size(bestW,bestH)){
        bestW=w;
        bestH=h;
    }
}