【发布时间】:2013-07-17 01:16:20
【问题描述】:
我有一个整数数组,我试图找到数组中所有值的 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。我真的无法解释。
算法应该可以工作——我已经在脑海中解决了。无法弄清楚我的代码有什么问题。
我们将不胜感激。
【问题讨论】:
-
这里不要使用递归,只需遍历数组查找连续的 LCM。
-
我不确定我是否理解您的设置方式,但您的第一个 if 语句是否会在同一个号码上调用 LCM 函数。例如,如果 start = 0,end = 1,那么您将返回 lcm(arr[0], arr[0]) = arr[0]
-
我想我可以改用循环,但此时我想知道为什么我的代码不起作用。 @Kon我希望基本情况是:当数组中剩下两个元素时,找到两个元素的lcm。 (输入数组的元素永远不会少于两个。)我应该将其更改为 (end-start==2) 吗?
-
您的代码实际上对我有用,并产生了预期的结果。 ideone.com/Afk4pO
-
问题已经清楚了:
else return gcd(b, a%b);