如何在不使用 Java 的 reduce 方法的情况下获得相同的结果?
How to get same result without using Java's reduce method?
我有方法可以给出多个数字的LCM。它与 Java 的 reduce() 方法一起使用,因此数字 1、2、3 给出的 LCM 为 6,这是正确的:
int lcmAnswer = Arrays.stream(numbers).reduce(1, (a, b) -> {
int total = lcmm(a, b);
return total;
}
);
System.out.println(lcmAnswer); // LCM(1, 2, 3) = 6
但是,如果我不使用 Java 的 reduce() 方法,那么数字 1、2、3 不会给我 6 的 LCM。它给了我 LCM(1, 2, 3) = 8,这是错误的:
int[] numbers = {1, 2, 3};
System.out.println(lcmm(1,2,3)); // LCM(1, 2, 3) = 8, which is wrong
private static int lcmm(int... numbers) {
int sum = 0;
for (int i = 0; i<numbers.length -1; i++) {
int curr = numbers[i];
int next = numbers [i+1];
sum += lcm(curr, next);
}
return sum;
}
private static int lcm(int p, int q) {
// Return lowest common multiple.
return p * q / gcd(p, q);
}
private static int gcd(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;
}
有人知道我做错了什么吗?
假设我们有四个数字a,b,c,d
。要计算a,b,c,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,b,c,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
我有方法可以给出多个数字的LCM。它与 Java 的 reduce() 方法一起使用,因此数字 1、2、3 给出的 LCM 为 6,这是正确的:
int lcmAnswer = Arrays.stream(numbers).reduce(1, (a, b) -> {
int total = lcmm(a, b);
return total;
}
);
System.out.println(lcmAnswer); // LCM(1, 2, 3) = 6
但是,如果我不使用 Java 的 reduce() 方法,那么数字 1、2、3 不会给我 6 的 LCM。它给了我 LCM(1, 2, 3) = 8,这是错误的:
int[] numbers = {1, 2, 3};
System.out.println(lcmm(1,2,3)); // LCM(1, 2, 3) = 8, which is wrong
private static int lcmm(int... numbers) {
int sum = 0;
for (int i = 0; i<numbers.length -1; i++) {
int curr = numbers[i];
int next = numbers [i+1];
sum += lcm(curr, next);
}
return sum;
}
private static int lcm(int p, int q) {
// Return lowest common multiple.
return p * q / gcd(p, q);
}
private static int gcd(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;
}
有人知道我做错了什么吗?
假设我们有四个数字a,b,c,d
。要计算a,b,c,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,b,c,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