pixel - 如何最小化两个整数,使它们的乘积小于某个值?
问题描述
给定两个整数,我怎样才能最小化它们,使它们的乘积小于其他值,同时保持它们的相对比率?
那是形式问题。实际问题是这样的:我的宽度/高度像素分辨率包含随机值(任一维度从 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;
}
当然,对于这个问题,必须有一种更具分析性的方法吗?
解决方案
编辑:误读了原始问题。
另一种表达你的问题的方法是用 aW
和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
whereA*B < C
和A/B = W/H
.
推荐阅读
- php - Wordpress 高级自定义字段变量未呈现
- python - python中的Matplotlib图形问题
- r - Lapply changing class of input
- google-bigquery - BigQuery:从 Coldline Cloud Storage 类查询 parquet 文件作为外部数据源的定价
- r - 有没有办法根据第三列中的字符用第二列中的字符替换数据框的一列中的字符?
- python - 在 Python3 中打印字符串的镜像
- python - 如何控制 x 轴刻度的数量?
- c - 是否有将双指针转换为单指针的编译器警告?
- c++ - C ++“相同字母”代码无法正常工作
- mongodb - 为什么使用 docker compose 运行时,MongoDB 的更新请求非常慢?