我需要在一个固定大小的长方形里面摆放N个正方形
正方形必须边长一致,摆放完成后,要尽可能占满长方形内部的空间
如何计算出最佳的正方形边长?
好久没来提问了,我没做太多尝试,数学太差。
如果可以的话,希望有人顺便告诉我这是几年级的数学。
我需要在一个固定大小的长方形里面摆放N个正方形
正方形必须边长一致,摆放完成后,要尽可能占满长方形内部的空间
如何计算出最佳的正方形边长?
好久没来提问了,我没做太多尝试,数学太差。
如果可以的话,希望有人顺便告诉我这是几年级的数学。
正方形的边长应该是长方形长和宽的最大公因数。
最大公因数相关知识应该是小学五年级的内容。
看错题目了。
如题意,在长为\(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
}
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))
有个平凡解,1x1像素正方形平铺开,100%使用率 ;)