2012-02-22 25 views
0

的(最大公约数)GCD这是一个简单的任务,但我似乎无法弄清楚如何做到这一点如何获得双打

下面是一个简单的功能结构

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

请帮助..谢谢!

回答

3

如果您只有一个小数位,请将数字乘以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 
+0

你能帮助我吗?我真的很难过。我认为我在数学恶化=( – 2012-02-22 09:29:45

+0

查看它在附加链接,或搜索GCD算法。几乎所有算法,你会发现是专为整数。 – 2012-02-22 09:31:31

+0

作出这一个,它的工作!谢谢private int GCD(int a ,INT b) { 如果(b == 0) 返回; 别的 返回GCD(b,A%b); } – 2012-02-22 10:51:18

1

有对的地方不计其数web来查找GCD函数的代码。严格地说,它只是用整数来定义的,所以我建议你将你的双精度乘以10,计算GCD并将结果除以10.这将为你节省使用错误数据类型所带来的痛苦世界。

2

当它是8.8和6.6,那么您可以发现的88和66的GCD,然后通过10

0

使用2种方法

  1. 传统的分割方法分割它
  2. 欧几里得的方法

    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; 
     } 
    } 
1

有没有这样的事情,一个数字的GCD不是离散的。但是,你的情况更具体。如果您的输入不是Double,而是Decimal,那么可以将其转换为分数,乘以分母,找到分子的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和20分之34。