如何获得双打的(最大公约数)GCD

时间:2012-02-22 09:25:12

标签: algorithm greatest-common-divisor

这是一项简单的任务,但我似乎无法弄清楚如何做到这一点

这是一个示例函数结构

private double GetGCD(double num1, double num2)
{
    //should return the GCD of the two double
}

测试数据

   num1 = 6;
   num2 = 3;
   *return value must be 3*

   num1 = 8.8;
   num2 = 6.6;
   *return value must be 2.2*

   num1 = 5.1;
   num2 = 8.5;
   *return value must be 1.7*

注意:最大小数位数为1。       编程语言并不重要。我只需要algorthm

请帮忙..谢谢!

6 个答案:

答案 0 :(得分:4)

如果您只有一位小数,请将数字乘以10,将它们转换为整数并运行integer GCD function

这也可以为您节省floating point precision errors

引用this answer,Python中的基本欧几里德算法(对于整数!)是:

def gcd(a, b):
    """Calculate the Greatest Common Divisor of a and b.

    Unless b==0, the result will have the same sign as b (so that when
    b is divided by it, the result comes out positive).
    """
    while b:
        a, b = b, a%b
    return a

所以,你的代码应该是这样的:

 def gcd_floats(x,y):
     return gcd( int(x*10), int(y*10) )/10

答案 1 :(得分:3)

当它是8.8和6.6时,你可以找到88和66的GCD,然后除以10。

答案 2 :(得分:1)

网上有数以万计的地方可以找到GCD功能的代码。严格说来,因为它只是在整数上定义,我建议你将你的双精度乘以10,算出GCD并将结果除以10.这样可以避免因使用错误的数据类型而产生的痛苦世界。

答案 3 :(得分:1)

这是google的一个来源,其中包含一些java代码:http://www.merriampark.com/gcd.htm这非常全面。

答案 4 :(得分:1)

没有一个不离散的数字的GCD。但是,您的情况更具体。如果您的输入不是Double,而是Decimal,那么您可以将其转换为Fraction,乘以分母,找到分子的GCD并向下分割。那就是:

8.800 = 8800/1000 = 44/5 (by GCD)
6.600 = 6600/1000 = 33/5 (by GCD)

5.100 = 5100/1000 = 51/10
8.500 = 8500/1000 = 17/2

在此步骤中简化分数非常有用,以避免数字过大。

转向共同点:

44*5/5*5 = 220/25
33*5/5*5 = 165/25

51*2/2*10 = 102/20
17*10/2*10 = 170/20

分子的GCD:

gcd(165,220) = 55

gcd(102,170) = 34

答案是55/25和34/20。

答案 5 :(得分:0)

使用2种方法

  1. 传统的划分方法
  2. 欧几里德的方法
  3. 
        class GCD
        {
            public static void main(String[] args)
            {
                int a = (int)(1.2*10);
                int b = (int)(3.4*10);
    
                System.out.println((float)gcd(a, b)/10);
            }
        // 1
    
            public static int gcd(int a, int b)
            {
                if(b==0)
                    return a;
                else
                    return gcd(b, (int)a%b);
            }
    
        // 2
            public static int gcd(int a, int b)
            {
                int k,i;
    
                if(a>b)
                    k = b;
                else
                    k = a;
    
                for(i=k; i>=2; i--)
                {
                    if( (a%i==0)&&(b%i==0) )
                    {
                        break;
                    }
                }
                return i;
            }
        }