获取n个数字的gcd

时间:2014-09-17 12:13:13

标签: java math greatest-common-divisor

这似乎是一个简单的问题,但我找不到解决方案。我必须找到n个数字的gcd。

public int getGCD(int a, int b) {
 if (b == 0) { return a; }
 else { return getGCD(b, a%b); }
}

这是计算两个数字的gcd的流行递归方式。但是,如果我需要获得3,4,5 ...... n个数字的gcd?我想做这样的事情:

public int getGCD(int[] a) {
 //the code  
}

有一个整数数组作为参数,但我不知道代码。你有什么建议吗?

4 个答案:

答案 0 :(得分:10)

可以通过递增计算两个数字的GCD来计算多个数gcd( n1, n2, .... nx )的GCD:

gcd( n1, n2, .... nx ) == gcd( n1, gcd( n2, gcd( ... , nx ) ) )

所有数字的每个除数都必须是这些数字的任何子集的除数。这反过来导致上述公式。

通过将给定的getGCD(int, int)函数重用为两个数字,我们可以创建一个额外的重载,它会获取一个或多个数字的列表:

public int getGCD(int a, int b) {
 // implementation for two numbers goes here
}

public int getGCD(int[] a) {
  // the GCD of a number with itself is... itself
  int gcd = a[0];

  // compute incrementally
  for( int i=1; i<a.length; i++ ) {
    gcd = getGCD( gcd, a[i] );
  }

  // return result
  return gcd;    
}

答案 1 :(得分:6)

试试这个,

public static void main(String[] args) {
    System.out.println(" GDC: " + getGdc(12, 48, 24, 5));
    System.out.println(" GDC: " + getGdc(12, 48, 24));
}

public static int getGdc(int... x) {
    // get the smallest of all number no need to check for higher values
    int smallest = getSmallest(x);

    for(int i = smallest; i >= 1; i--) {
       int j;
       for(j = 0; j < x.length; ++j) {
           if(x[j] % i != 0)
               break;
       }
       // if we pass through the array with all % == 0 return the value
       if(j == x.length)
           return i;
    }
    // so the only possible is 1
    return 1;
}

// return smallest number of an array of int
public static int getSmallest(int[] x) {
    int smallest = x[0];
    for(int i = 1; i < x.length; ++i) {
        if(x[i] < smallest)
            smallest = x[i];
    }
    return smallest;
}

有关详情,请参阅this。希望这有帮助

答案 2 :(得分:3)

Java的最新功能在这里可以派上用场。我们的想法是,我们从a获取前两个数字,找到他们的gcd,并将其放回a。这正是reduce操作所做的事情(虽然我将intStream使用reduce)。

然后你有:

public int getGCD(int[] a) {
    Arrays.stream(a).reduce( (b,c) -> getGCD(b,c) ).getAsInt();
}

您可以使用方法引用替换lambda表达式:

    Arrays.stream(a).reduce(ClassName::getGCD).getAsInt();

(虽然我假设编译器会知道你指的是getGCD(int,int)。如果它抱怨,你必须重命名一个方法。)

答案 3 :(得分:0)

package may23;
/**
 * 
 * @author Ramkumar Raja
 *
 */
public class GcdofArrayNumbers {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int arr[]={8,16,80};
        int temp=0;
        for(int i =0;i<arr.length;i++)
        {
            if(i==0)
            {
                temp=gcdArray(arr[i+1], arr[i]);
                i++;
            }
            else
            {
                temp=gcdArray(temp, arr[i]);
            }
        }
        System.out.println("Gcd"+temp);


    }

    public static int gcdArray(int a,int b)
    {
        int gcd=0;
        for(int i=1;i<=a && i<=b;i++)
        {
            if(a%i==0 && b%i==0)
            {
                gcd=i;
            }

        }

        return gcd;

    }

}