给定十进制数,找到给出整数结果的最小整数乘数

时间:2010-03-12 15:59:24

标签: algorithm math

最好用一个例子来描述问题。假设我的小数值为100.227273。

100.227273 * X = Y

我需要找到给出整数Y的最小正整数X.

5 个答案:

答案 0 :(得分:18)

如果100.227273只是一个近似值,并且您希望获得最佳有理逼近,请使用continued fractions

以100.227273为例。

  1. 取整数部分(100)。现在你得到100.227273 = 100 + 0.227273。
  2. 反转0.227273得4.39999(4.4?)。
  3. 重复步骤1,直到您对错误感到满意为止。
  4. 所以你得到了

                           1
    100.227273 = 100 + —————————
                             1
                       4 + —————
                               1
                           2 + —
                               2
    

    简化此表达式以获得2205/22。

    [编者注:例如代码,请参阅this answer。]

答案 1 :(得分:12)

1000000/gcd(1000000,227273)。也称为lcm(1000000,227273)/227273。在这种情况下,100万。

您想要做的是将0.227273变成最简单形式的分数。您正在寻找的数字是该分数的分母。由于227273/1000000已经是最简单的形式,你已经完成了。但如果你的输入是100.075,那么75/1000不是最简单的形式。最简单的形式是3/40,因此X的解决方案是40。

作为优化,你可以简化计算,因为你知道起始分母是10的幂,所以它唯一的素数因子是2和5.所以你需要在分子中寻找的是2的可分性和5,这比Euclid的算法更容易。当然,如果你已经有了gcd和/或lcm的实现,那么你需要付出更多努力,而不是更少。

请记住,当您得到结果时,浮点数通常不能精确地表示小数部分。因此,一旦你有了数学上正确的答案,当你进行浮点乘法时,它不会必然给你一个整数答案。另一方面,当然这个问题仅适用于您感兴趣的数字的有限十进制表达式。

如果您首先将数字作为商,那么您需要直接找到其最简单形式的分母,而不是将其转换为十进制并截断它。例如,要解决数字“6和三分之一”的问题,答案是3,而不是10的任何幂。如果输入是“2的平方根”,那么X没有解。

实际上,具有您需要的属性的最小整数X是0,但我认为您不是那个意思; - )

答案 2 :(得分:3)

我有种感觉你的意思是这样的:
How to convert floats to human-readable fractions?

答案 3 :(得分:1)

如果正十进制值D在小数点右边有n位,那么D * 10 ^ n是一个整数,X = 10 ^ n / gcf(10 ^ n,D * 10 ^ n)= lcm (10 ^ n,D * 10 ^ n)是最小的正整数X.

答案 4 :(得分:1)

我假设输入十进制r是一个带有终止十进制表示的正有理数r

d为小数点后的位数(假设我们已从r的decmial表示中修剪了所有无关的零)。然后请注意10^d * r是一个整数m。让g = gcd(10^d, m)。然后10^d / g * r = m / g是整数p。让q = 10^d / g。我声称q是最小的正整数。