假设我们有两个数字(不一定是整数)x1
和x2
。比如说,用户输入一个数字y
。我想要找到的是y'
接近y
的数字,以便x1 % y'
和x2 % y'
非常小(例如,小于0.02
,但是我们可以拨打这个号码LIMIT
)。换句话说,我不需要最优算法,但需要很好的近似。
我感谢你们所有的时间和精力,这真的很棒!
让我解释一下我的应用程序中的问题:比如,给出了一个屏幕尺寸,宽度为screenWidth
,高度为screenHeight
(以像素为单位) )。我在屏幕上填充长度为y'
的正方形。比如说,用户希望方块大小为y
。如果y
不是screenWidth
和/或screenHeight
的除数,则屏幕两侧会有未使用的空间,大小不足以适合正方形。如果那个未使用的空间很小(例如一行像素),那就不是那么糟糕,但如果不是这样,它看起来不会很好。如何找到screenWidth
和screenHeight
的公约数?
答案 0 :(得分:2)
我看不出你怎么能确保x1%y'和x2%y'都低于某个值 - 如果x1是素数,则没有任何东西低于你的极限(如果极限低于1),除非x1(或非常接近)和1。
所以唯一有效的答案是琐碎的y'= 1。
如果你允许非整数除数,那么只需选择y'= 1 /(x1 * x2),因为余数总是为0。
不将公约数限制为整数,它可以是任何东西,并且整个“最大公约数”概念都会出现。
答案 1 :(得分:1)
x1
和x2
不是很大,所以一个简单的强力算法应该足够好了。
将x1
和x2
划分为y
并计算结果的最低限额和最高限额。这会给出四个数字:x1f
,x1c
,y1f
,y1c
。
选择其中一个,最接近x1/y
(x1f
,x1c
)或x2/y
(for y1f
,{{1}的确切值}})。例如,让它为y1c
。设置x1f
。如果y' = x1/x1f
和x1%y'
都不大于y1%y'
,则成功(limit
是最佳近似值)。否则,将y'
添加到四个号码(或x1f - 1
,y1f - 1
或x1c + 1
)的池中,选择另一个最接近的号码并重复。
答案 2 :(得分:1)
您希望在固定区域内安装最大量的均匀间隔的方块。通过一些简单的数学计算,可以找到解决问题的最佳解决方案。
假设您有一个宽度= W且高度= H的区域,并且您尝试使用长度= x的边来拟合正方形。水平和垂直的最大平方数,我将分别称为max_hor和max_vert,是max_hor = floor(W / x)和max_vert = floor(H / x)。如果您并排绘制所有正方形,没有任何空间,则每行和每列都会有一个休息。让我们分别通过rest_w和rest_h调用水平/垂直休止符。这种情况如下图所示:
请注意,rest_w = W-max_hor x和rest_h = H-max_vert x。
你想要的是将rest_w和rest_h equaly分开,生成大小为space_w和space_h的小水平和垂直空间,如下图所示:
请注意,space_w = rest_w /(max_hor + 1)和space_h = rest_h /(max_vert + 1)。
这是你要找的号码吗?
答案 3 :(得分:-1)
我相信我犯了一个错误,但我不明白为什么。根据{{3}},我决定限制为整数值,但将x1
和x2
乘以10
的幂。之后,我将公共整数除数除以该数。
在线,我找到了Phil H's answer。试验它让我意识到它不会给我任何常见的除数......我尝试了多个案例(x1
= 878000和x2
= 1440000和其他一些案例),但没有一个案例有好结果
换句话说,您可能需要乘以非常高的数字才能获得结果,但这会使计算变得非常非常慢。
如果有人能解决这个问题,那就太棒了。但就目前而言,我决定利用screenWidth
和screenHeight
是合适的数字这一事实,因为它们是计算机屏幕的维度。 900
和1440
有足够多的公约数,所以我可以使用它......
感谢大家在这个帖子和m common factors calculator上的答案。