学渣求助一个简单的数学问题,我甚至连标题都想不出来,可能太简单了?

我需要在一个固定大小的长方形里面摆放N个正方形

正方形必须边长一致,摆放完成后,要尽可能占满长方形内部的空间

如何计算出最佳的正方形边长?

image.png
image.png
好久没来提问了,我没做太多尝试,数学太差。

如果可以的话,希望有人顺便告诉我这是几年级的数学。

阅读 800
3 个回答

有个平凡解,1x1像素正方形平铺开,100%使用率 ;)

正方形的边长应该是长方形长和宽的最大公因数。

最大公因数相关知识应该是小学五年级的内容。


看错题目了。

如题意,在长为\(W\),宽为\(H\)的长方形中放置\(N\)个正方形,求正方形边长\(a\)的最大值。

即,求解不等式:

$$ \lfloor \frac W a \rfloor \cdot \lfloor \frac H a \rfloor \ge N $$

使用二分法求解:

function calc_length(w: number, h: number, n: number) {
    let l = 0,
        r = Math.sqrt((w * h) / n)
    while (r - l > Number.EPSILON) {
        const m = (l + r) / 2
        if (Math.floor(w / m) * Math.floor(h / m) >= n) l = m
        else r = m
    }
    return l
}

总觉得应该不是小学的题,这样实现感觉没啥问题。

屏幕截图 2024 06 23 235248
Java:

class HelloWorld {
  public static void main(String[] args) {
    System.out.println(calcSide(1024, 720, 220));
  }

  public static int calcSide(int width, int height, int len) {
    int side;
    int initCols = 1;
    while (true) {
      side = width / initCols;
      int m = len % initCols;
      int c = len / initCols;
      if (c * side < (m != 0 ? side: m) + height) {
        break;
      }
      initCols++;
    }
    return side;
  }
}

Js:

function calcSide(width, height, len) {
    let side;
    let initCols = 1;
    while (true) {
        side = width / initCols;
        let m = len % initCols;
        let c = len / initCols;
        if (c * side < (m != 0 ? side : m) + height) {
            break;
        }
        initCols++;
    }
    return side;
}
console.log(calcSide(1024, 720, 220))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏