给定两个整数,如何最小化它们,使它们的乘积小于其他值,同时保持它们的相对比率?
这就是形式问题。实际问题是这样的:我的宽度/高度像素分辨率包含随机值(任一维度为 1 到 8192 之间的任意值)。我想调整值对,以便它们的乘积不超过像素总数(例如:1000000),并且我需要确保调整后的分辨率的长宽比保持不变(例如:1.7777)。
最简单的方法是运行一个循环,每次从宽度中减去 1,调整高度以匹配长宽比,直到它们的乘积低于阈值。例如:
int wid = 1920;
int hei = 1080;
float aspect = wid / (float)hei;
int maxPixels = 1000000;
while (wid * hei > maxPixels)
{
wid -= 1;
hei = wid / aspect;
}
当然必须有一种更具分析性的方法来解决这个问题吗?
最佳答案
编辑:误读了原来的问题。
表达问题的另一种方式是使用 W
和H
最大的是什么a
和b
这样a/b = W/H
和a*b < C
哪里C
是你的极限。
为此,请找到 D = gcd(W,H)
或 W
的最大公约数和H
。最大公分母通常是使用欧几里得算法找到的。
设置x = W/D
和y = H/D
,这是具有相同比率的最小解。
产生C
下的最大值,从 F*x*F*y <= C
的不等式开始其中 F 是 x
的比例因子和y
代数:
F^2 <= C/(x*y)
F <= sqrt(C/(x*y))
由于我们希望 F 是整数并且严格小于上面的值,
F = floor(sqrt(C/(x*y)))
这将为您提供新的解决方案 A = x*F
和B = y*F
哪里A*B < C
和A/B = W/H
.
关于pixel - 如何最小化两个整数,使其乘积小于某个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60591602/