如何解决如何在不使用Java的reduce方法的情况下获得相同的结果?
我有应该给LCM多个数字的方法。它与Java的reduce()方法配合使用,因此数字1,2,3的LCM为6,这是正确的:
merged_rows
但是,如果我不使用Java的reduce()方法,那么数字1,3不会给我6的LCM。它给我的LCM(1,3)= 8,这是错误的:
int lcmAnswer = Arrays.stream(numbers).reduce(1,(a,b) -> {
int total = lcmm(a,b);
return total;
}
);
System.out.println(lcmAnswer); // LCM(1,3) = 6
有人知道我在做什么错吗?
解决方法
假设我们有四个数字a,b,c,d
。要计算a,d
的LCM,我们需要执行以下步骤:
让最终的LCM为RES
。
- 计算前两个数字
a
和b
的LCM。将值分配给RES
。因此,RES = LCM(a,b)
。 - 计算
RES
和c
的LCM。更新RES
的值。因此,RES = LCM(RES,c)
。 - 计算
RES
和d
的LCM。更新RES
的值。因此,RES = LCM(RES,d)
。
RES
的最终值将包含a,d
的LCM。
我们可以按照此算法来计算多个数字的LCM。
这里是实现:
import java.util.*;
import java.lang.*;
import java.io.*;
class LCMMultiple{
public static void main (String[] args) throws java.lang.Exception{
int[] numbers = {1,2,3};
System.out.println(getLcmMultiple(numbers));
}
private static int getLcmMultiple(int... numbers) {
int lcm = 0;
for (int i = 0; i<numbers.length -1; i++) {
int curr = numbers[i];
int next = numbers [i+1];
if(lcm != 0){
lcm = getLcm(lcm,getLcm(curr,next));
}
else{
lcm = getLcm(curr,next);
}
}
return lcm;
}
private static int getLcm(int p,int q) {
// Return lowest common multiple.
return p * q / getGcd(p,q);
}
private static int getGcd(int p,int q) {
//Return greatest common divisor using Euclid's Algorithm.
int temp;
while (q != 0) {
temp = q;
q = p % q;
p = temp;
}
return p;
}
}
输出:
6
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。