最接近某个值的公约数的近似值?

时间:2012-02-09 12:16:49

标签: algorithm math geometry

假设我们有两个数字(不一定是整数)x1x2。比如说,用户输入一个数字y。我想要找到的是y'接近y的数字,以便x1 % y'x2 % y'非常小(例如,小于0.02,但是我们可以拨打这个号码LIMIT)。换句话说,我不需要最优算法,但需要很好的近似。

我感谢你们所有的时间和精力,这真的很棒!


让我解释一下我的应用程序中的问题:比如,给出了一个屏幕尺寸,宽度为screenWidth,高度为screenHeight(以像素为单位) )。我在屏幕上填充长度为y'的正方形。比如说,用户希望方块大小为y。如果y不是screenWidth和/或screenHeight的除数,则屏幕两侧会有未使用的空间,大小不足以适合正方形。如果那个未使用的空间很小(例如一行像素),那就不是那么糟糕,但如果不是这样,它看起来不会很好。如何找到screenWidthscreenHeight的公约数?

4 个答案:

答案 0 :(得分:2)

我看不出你怎么能确保x1%y'和x2%y'都低于某个值 - 如果x1是素数,则没有任何东西低于你的极限(如果极限低于1),除非x1(或非常接近)和1。

所以唯一有效的答案是琐碎的y'= 1。

如果你允许非整数除数,那么只需选择y'= 1 /(x1 * x2),因为余数总是为0。

不将公约数限制为整数,它可以是任何东西,并且整个“最大公约数”概念都会出现。

答案 1 :(得分:1)

x1x2不是很大,所以一个简单的强力算法应该足够好了。

x1x2划分为y并计算结果的最低限额和最高限额。这会给出四个数字:x1fx1cy1fy1c

选择其中一个,最接近x1/yx1fx1c)或x2/yfor y1f,{{1}的确切值}})。例如,让它为y1c。设置x1f。如果y' = x1/x1fx1%y'都不大于y1%y',则成功(limit是最佳近似值)。否则,将y'添加到四个号码(或x1f - 1y1f - 1x1c + 1)的池中,选择另一个最接近的号码并重复。

答案 2 :(得分:1)

您希望在固定区域内安装最大量的均匀间隔的方块。通过一些简单的数学计算,可以找到解决问题的最佳解决方案。

假设您有一个宽度= W且高度= H的区域,并且您尝试使用长度= x的边来拟合正方形。水平和垂直的最大平方数,我将分别称为max_hor和max_vert,是max_hor = floor(W / x)和max_vert = floor(H / x)。如果您并排绘制所有正方形,没有任何空间,则每行和每列都会有一个休息。让我们分别通过rest_w和rest_h调用水平/垂直休止符。这种情况如下图所示:

Squares side by side

  

请注意,rest_w = W-max_hor x和rest_h = H-max_vert x。

你想要的是将rest_w和rest_h equaly分开,生成大小为space_w和space_h的小水平和垂直空间,如下图所示:

Evenly spaced squares

  

请注意,space_w = rest_w /(max_hor + 1)和space_h = rest_h /(max_vert + 1)。

这是你要找的号码吗?

答案 3 :(得分:-1)

我相信我犯了一个错误,但我不明白为什么。根据{{​​3}},我决定限制为整数值,但将x1x2乘以10的幂。之后,我将公共整数除数除以该数。

在线,我找到了Phil H's answer。试验它让我意识到它不会给我任何常见的除数......我尝试了多个案例(x1 = 878000和x2 = 1440000和其他一些案例),但没有一个案例有好结果

换句话说,您可能需要乘以非常高的数字才能获得结果,但这会使计算变得非常非常慢。

如果有人能解决这个问题,那就太棒了。但就目前而言,我决定利用screenWidthscreenHeight是合适的数字这一事实,因为它们是计算机屏幕的维度。 9001440有足够多的公约数,所以我可以使用它......

感谢大家在这个帖子和m common factors calculator上的答案。