数学难题,如何计算长宽比例?

2021-03-10 15:30:38 +08:00
 61162833
我们知道分辨率有 16:9,也有 4:3

比如几组分辨为:982x737 、1080x608,怎么计算出来这是什么比例的?

也就是怎么推算出 982x737 = 4:3
3112 次点击
所在节点    问与答
53 条回复
washbrain
2021-03-10 16:17:26 +08:00
另外, 982:737 并不等于 4:3,这个是近似到常见比例
61162833
2021-03-10 16:20:35 +08:00
@washbrain "分子分母同时除以最大公约数"

大佬,你太牛鼻了!!!解决了我多年的困惑!!!谢谢啊!!!请抽华子!!!请喝阔乐!!!
tcfenix
2021-03-10 16:23:52 +08:00
@61162833
前面数学公式我也给你推导了, 只是给一个长宽比从数学上是算不出来是哪两个数字相除才能得到它的......只能靠自己维护一个表.....
auroraccc
2021-03-10 16:24:38 +08:00
可以用辗转相除法先算出最大公约数,然后再同时除以这个公约数就好了
ex (JS):
var 宽 = 1920
var 高 = 1080
var 辗转相除法 = (m , n) => m % n === 0 ? (n) : 辗转相除法(n, m % n);
var 最大公约数 = 辗转相除法(宽, 高)
var 长宽比 = `${宽 / 最大公约数}:${高 / 最大公约数}`
console.log(长宽比) // 16:9
61162833
2021-03-10 16:26:42 +08:00
@tcfenix @washbrain 谢谢!

也就是没有最大公约数的比如 982:737,要得出 4:3 就只能靠表来推算了是吗?
necpom
2021-03-10 16:28:10 +08:00
@61162833 "根据 1920 与 1080 这两个值,算出 16 与 9 这两个值" 公约数公倍数不是小学学的吗?
61162833
2021-03-10 16:30:13 +08:00
@auroraccc 谢谢,太 6 了,这中文代码可以直接贴在 Chrome Console 里运行。惊呆
61162833
2021-03-10 16:32:06 +08:00
@necpom 小学生,向各位大佬请教
Tumblr
2021-03-10 16:33:46 +08:00
@61162833 #17 看得累 shi 了。。。这不就是个「约分」么。。。
不过有些不是严格意义上的 4:3 或 16:9,遇到这种就除掉之后找最近的比例了。
61162833
2021-03-10 16:35:31 +08:00
我表达能力水平低,不好意思各位!!!
Mountain
2021-03-10 16:46:54 +08:00
还是好人多,楼主加油
crab
2021-03-10 16:53:51 +08:00
最大公约数
jmc891205
2021-03-10 17:20:04 +08:00
哈哈哈😄你不想查表
那请问你要怎么把 982/737 约分
flineqaq
2021-03-10 17:24:25 +08:00
两个数分别质因数分解,去掉相同的质因数,剩下的相乘。这问题需要思考吗。。?
otakustay
2021-03-10 18:11:01 +08:00
首先指定一个“到整数的允许误差”,比如 0.01 ,即 4.99-5.01 都算是整数 5
然后拿到比例,比如前面提到的 1.666666666666667
再把这个数组往整数倍乘,找到某个倍数的时候它和一个整数的误差在允许误差范围内
1.666666666666667 * 1 = 1.666666666666667,与 1 的误差有 0.66 ,与 2 的误差有 0.34 ,所以它不行
1.666666666666667 * 2 = 3.333333333,两端误差分别是 0.33 和 0.67 ,也不行
1.666666666666667 * 3 = 5,非常标准的整数
这个时候,参与运算的 2 个数,3 和 5,就是对应的比例了,也就是说对应 5:3

用同样的方法,1920x1080,先算出 1920/1080=1.777777778,再把 1.777777778 往上乘,最后在乘以 9 的时候能得到 16.000000002,在误差范围内,所以是 16:9

你可以设定一个乘数的最大值,比如一直乘到 120 都找不到一个整数,直接认为这比例没法算
otakustay
2021-03-10 18:16:36 +08:00
对应到 JS 代码的版本:
https://gist.github.com/otakustay/37d28c2003a6b8e9a4179a8d662463df

对于计算机来说,跑 120 次应该问题不大
kaiki
2021-03-10 18:22:08 +08:00
除了 16:10 都是公约数,因为它不写作 8:5 是为了和 16:9 作对比更方便人们理解。
其他的比例只能按照预设的比例找最近的了
lululau
2021-03-10 18:23:47 +08:00
982 除以 737 = 4:3 ?

如果你是 80 后,你父母可能违法了,义务教育法。。。
wolfie
2021-03-10 18:32:26 +08:00
1L 不就是正确答案吗?
gwy15
2021-03-10 18:32:41 +08:00
对于 a / b,先连分数展开到五六位,然后依次截断,选一个你觉得顺眼的就行。

比如 982/737,连分数展开是 1, 3, 122, 2,依次截断分别是 1, 4/3, 489/367, 982/737,你觉得 4/3 顺眼就选这个

比如 1080/608,连分数展开是 1, 1, 3, 2, 8,依次截断分别是 1, 2, 7/4, 16/9, 135/76,选个你顺眼的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760354

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX