2

我有一个整数数组,我试图找到数组中所有值的 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 as arr、0 asstart和数组长度 as 的数组时end,我得到 30 作为答案,而我想要 60。当我放入一个包含从 1 到所有数字的数组时10,我得到840而不是2520。我真的无法解释。

算法应该可以工作——我已经在脑海中解决了。无法弄清楚我的代码有什么问题。

任何帮助将不胜感激。

4

4 回答 4

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

它应该可以正常工作。

于 2013-12-15T20:41:36.693 回答
1

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

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);
    }
}
于 2021-04-23T05:14:55.453 回答
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;
}
于 2018-01-24T15:59:51.990 回答
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);
    }
}

于 2019-04-01T19:13:33.547 回答