Java中的LCM(最低公倍数)

时间:2013-01-29 15:15:39

标签: java

我需要这个循环的帮助。我的课程作业之一是制作LCM课程。

Sample output:
(8,12) LCM is 24
(4,3) LCM is 12
(5,10,20) LCM is 20
(18,24,52) LCM is 936
(12,10,26) LCM is 780
(99,63,24) LCM is 5544
(62,16,24) LCM is 1488

到目前为止,我有2个数字,但我不知道如何做3个数字。我们应该在其他类上使用方法,所以这就是我对LCM类的方法。

public class LCM {
    private int n, x, s = 1, t = 1;

    public LCM()
    {
        n = 0;
        x = 0;
        s = 1;
        t = 1;
    }
    public int lcmFind(int i, int y) {
        for (n = 1;; n++) {
            s = i * n;
            for (x = 1; t < s; x++) {
                t = y * x;
            }
            if (s == t)
                break;
        }
        return (s);
    }
}

8 个答案:

答案 0 :(得分:2)

如果您想获得3+号码的LCM,可以按照以下方式使用您的方法lcmFind

int a = 2;
int b = 3;
int c = 5;
LCM l = new LCM();
int lcm = l.lcmFind(l.lcmFind(a, b), c);

Reccomendations:

  • n中制作xstlcmFind个变量。因为您只需要在lcmFind方法中使用它们,并且需要在lcmFind的每次调用中重置它们的值。
  • lcmFind方法设为静态。您不需要实例化新对象以便计算lcm。这样您可以像LCM.lcmFind(3,4)一样使用它,甚至可以更好地重命名方法并使用类似LCM.find(3,4)的内容。

修改
如果您需要创建采用可变数量参数的方法,则应检查varargs。所以你会得到类似的东西:

public int lcmFind(int.. args) {
    // args is actually array of ints.
    // calculate lcm of all values in array.
    // usage: lcmFind(1,4) or lcmFind(1,5,6,3)
}

您可以使用带有2个参数的lcmFind的第一个版本,并使用它计算lcm的多个值。

编辑2
如果你只需要2 {3} args版本的lcmFind,那么你可以添加3-arg版本:

public int lcmFind(int a, int b, int c) {
    return lcmFind(lcmFind(a, b), c); 
}

答案 1 :(得分:2)

我发现了这个link,我想这是最简单,最干净的解决方案:

-Cred

答案 2 :(得分:1)

尝试

public int lcm(int... a) {
    for (int m = 1;; m++) {
        int n = a.length;
        for (int i : a) {
            if (m % i != 0) {
                break;
            }
            if (--n == 0) {
                return m;
            }
        }
    }
}

答案 3 :(得分:0)

static int  getLCM(int a,int b)
{
    int x;
    int y;
    if(a<b)
    {
        x=a;
         y=b;   
    }
    else
    {
         x=b;
         y=a;   
    }
    int i=1;
    while(true)
    {

        int x1=x*i;
        int y1=y*i;
        for(int j=1;j<=i;j++)
        {
        if(x1==y*j)
        {
            return x1;
        }
        }

        i++;
    }



}

答案 4 :(得分:0)

我认为你已经有了答案,因为这是一篇旧帖子。仍然发布我的答案。下面是查找数组的LCM的代码:

 import java.util.Arrays;
 import java.util.Scanner;

public class ArrayEqualAmz {
    static int lcm =1;
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int [] arr = new int[n];

    for(int i=0; i<n; i++){
        arr[i] = sc.nextInt();
    }
    System.out.println("lcm = "+lcm(arr));

    }

    // find the factor
    public static int divisor(int x[]){
        Arrays.sort(x);
        int num=0;
        for(int i=x.length-1; i>=0; i--){
            if(x[i] != 1 )
            num=x[i];
        }
        for(int j=2; j<=num; j++){
            if(num%j==0){
            return j;}
        }
        return num;
    }

    //finding the lcm
    public static int lcm(int arr[]){
        while(true){

        int j = divisor(arr);
        if(j==0){break;}
        lcm = lcm*j;
        for(int i=0; i<arr.length; i++){
            if(arr[i]%j==0){
            arr[i] = arr[i]/j;}
        System.out.print(arr[i]+",");
        }
        System.out.println( " factor= "+lcm);
        return lcm(arr);
        }
        return lcm;
    }


}

答案 5 :(得分:0)

试试这个

     int n1 = 72, n2 = 120, lcm;

    // maximum number between n1 and n2 is stored in lcm
    lcm = (n1 > n2) ? n1 : n2;

    // Always true
    while(true)
    {
        if( lcm % n1 == 0 && lcm % n2 == 0 )
        {
            System.out.printf("The LCM of %d and %d is %d.", n1, n2, lcm);
            break;
        }
        ++lcm;
    }

答案 6 :(得分:0)

public static int gcd(int a, int b){
    return (b == 0) ? a : gcd(b, a % b);
}

public static int gcd(int... args){
    int r = args[0]
    int i = 0;
    while(i < args.lenght - 1)
        r = gcd(r,args[++i]);
    return r;
}

public static int lcm(int a, int b){
    return a * b / gcd(a,b);
}

public static int lcm(int... args){
    int r = args[0]
    int i = 0;
    while(i < args.lenght - 1)
        r = lcm(r,args[++i]);
    return r;
}

答案 7 :(得分:0)

您可以重新使用为两个数字的 lcm 编写的相同函数。只需传递以下参数之一:

函数代码可以是这样的:

public static int lcm(int num1,int num2) {
        boolean flag = false;
        int lcm = 0;
        for(int i= 1;!flag; i++){
           flag = (num1 < num2)?(num2*i)%num1==0:(num1*i)%num2==0;
           lcm = num1<num2?num2*i:num1*i;
        }
        return lcm;
    }

像这样调用函数:

    public static void main(String[] args) {
        System.out.println("lcm "+lcm(lcm(20,80),40));
    }