我有一个int数组,我正在尝试找到数组中所有值的LCM(最小公倍数)。我分别写了一个lcm
方法;它需要两个值作为输入,并返回lcm。我的lcm
方法完全正常,但当我用它来查找所有值的LCM时,我得到了错误的答案。
以下是我的gcd
和lcm
方法:
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.我实在无法解释。
该算法应该可行 - 我已经在脑海中解决了这个问题。无法弄清楚我的代码有什么问题。
任何帮助将不胜感激。
答案 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);
}
}