这似乎是一个简单的问题,但我找不到解决方案。我必须找到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
}
有一个整数数组作为参数,但我不知道代码。你有什么建议吗?
答案 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;
}
}