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

Geometry 具有给定整数面积和整数边的最小周长矩形,geometry,integer,Geometry,Integer,给定一个整数区域A,如何找到矩形的整数边w和h,使得w*h=A和w+h尽可能小?我宁愿算法简单而不是高效(尽管在合理的效率范围内) 实现这一目标的最佳方式是什么 找出A的主要因素,然后以某种方式组合它们,试图平衡w和h?找到两个面积最接近A的边为整数的正方形,然后在它们之间进行插值?还有什么我没想到的方法吗?这是我脑子里想出来的东西 从w=1开始;h=A 然后迭代w,增加它。每次增加w后,只要w*h>A就可以尝试减少h。 此外,还需要某种启发式函数来确定w/h组合的大小。让我们称之为size(x

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

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


找出A的主要因素,然后以某种方式组合它们,试图平衡w和h?找到两个面积最接近A的边为整数的正方形,然后在它们之间进行插值?还有什么我没想到的方法吗?

这是我脑子里想出来的东西

w=1开始;h=A

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

在每个步骤中,您必须检查
size(w,h)是否只需要找到:

  • A的最大系数不大于sqrt(A),以及
  • 不小于sqrt(A)的A的最小因子
这两者的乘积总是A,所以这些因素就是你的
w
h

当然,你只需要搜索其中一个,因为一旦你有了
w
,你就可以设置
h=A/w

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;
    }
}