Java中数组中所有数字的LCM

时间:2013-07-17 01:16:20

标签: java arrays recursion lcm

我有一个int数组,我正在尝试找到数组中所有值的LCM(最小公倍数)。我分别写了一个lcm方法;它需要两个值作为输入,并返回lcm。我的lcm方法完全正常,但当我用它来查找所有值的LCM时,我得到了错误的答案。

以下是我的gcdlcm方法:

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


public static int lcm(int a, int b){
    return ((a*b)/gcd(a,b));

} 

这就是我对数组值lcm的所有内容:

public static int lcmofarray(int[] arr, int start, int end){
    if ((end-start)==1) return lcm(arr[start],arr[end-1]);
    else return (lcm (arr[start], lcmofarray(arr, start+1, end)));
}

当我将数字1到5的数组作为arr,0作为start并且数组的长度为end时,我得到30作为答案,虽然我想要60.当我输入一个包含1到10的所有数字的数组时,我得到的是840而不是2520.我实在无法解释。

该算法应该可行 - 我已经在脑海中解决了这个问题。无法弄清楚我的代码有什么问题。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:6)

如果您将gcd功能更改为

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

它应该可以正常工作。

答案 1 :(得分:1)

这是使用公式lcm为n个数字的数组查找lcm和gcd的程序gcd=ab

public class Main
{
    public static void main(String[] args) {
        int a[]={63,105,210};
        int lcm=1,fir=lcm,res=0;
        for(int i=0;i<a.length;i++)
        {
            int sec=a[i];
            lcm=(fir*sec)/gcd(fir,sec);
            fir=lcm;
        }
        for(int j=0;j<a.length;j++)
        {
            res=gcd(res,a[j]);
        }
        System.out.println("lcm is "+lcm+" "+"gcd is "+res);
    }
    
    public static int gcd(int a,int b)
    {
        if(b==0)
        {
            return a;
        }
        return gcd(b,a%b);
    }
}

答案 2 :(得分:0)

上面的方法看起来不错,但由于递归调用而导致堆栈溢出错误:

请找到以下解决方案:

    public int findHCF(int a, int b) {

    if (b>a){
        return findHCF(b, a);
    }

    while(a%b!=0){

        int temp = b;
        b=a%b;
        a=temp;
    }
    return b;
}

答案 3 :(得分:0)

  

有关代码背后逻辑的简要说明-

     

LCM(a,b)= a * b / HCF(a,b)

您可以使用以下代码执行此操作-

package hackerrank;

/*
 * Author Hirak JD
 */
import java.util.Arrays;

public class LCM {
    public static void main(String args[]) {
        int[] set= {2,3,6,8};
        int lcm=1;
        for(int each:set) {
            lcm=calculateLcm(lcm,each);
        }

        System.out.println("LCM for "+Arrays.toString(set)+" is : "+lcm);

    }

    private static int calculateLcm(int lcm, int each) {
        return lcm*each/gcd(lcm,each);
    }

    private static int gcd(int val1, int val2) {
        if(val1==0||val2==0)
            return 0;

        if(val1==val2)
            return val1;

        if(val1>val2)
            return gcd(val1-val2,val2);
        return gcd(val1,val2-val1);
    }
}