如何在不使用 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.

  • 计算前两个数字 ab 的 LCM。将值分配给 RES。所以,RES = LCM(a,b).
  • 计算 RESc 的 LCM。更新 RES 的值。所以,RES = LCM(RES,c).
  • 计算 RESd 的 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