Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到两个数字的最小公倍数(LCM)_Java_C++_Math_Lcm - Fatal编程技术网

Java 如何找到两个数字的最小公倍数(LCM)

Java 如何找到两个数字的最小公倍数(LCM),java,c++,math,lcm,Java,C++,Math,Lcm,我用欧几里德的方法找到了两个数字的L.C.M l.c.m=a*b/(gcd(a,b)) 如果不使用此算法,我如何做到这一点? 我有一个想法,首先得到这两个数字的所有因子,并将它们存储在数组中。然后从数组1中提取1个元素并在数组2中搜索它,如果它存在,则将其从数组中移除,并使结果乘以该数值 这样行吗?我相信你建议的算法是,检查一下它是否适合你。差不多。4和8的LCM是多少?显然是8(23),但在你的方法中你会发现2。您不仅需要跟踪所有因素,还需要跟踪它们出现的频率。您可以通过首先获得GCD来获得

我用欧几里德的方法找到了两个数字的L.C.M

l.c.m=a*b/(gcd(a,b))
如果不使用此算法,我如何做到这一点? 我有一个想法,首先得到这两个数字的所有因子,并将它们存储在数组中。然后从数组1中提取1个元素并在数组2中搜索它,如果它存在,则将其从数组中移除,并使结果乘以该数值


这样行吗?

我相信你建议的算法是,检查一下它是否适合你。

差不多。4和8的LCM是多少?显然是8(23),但在你的方法中你会发现2。您不仅需要跟踪所有因素,还需要跟踪它们出现的频率。

您可以通过首先获得GCD来获得两个数字的LCM。 以下是上述问题的解决方案

package com.practice.competitive.maths;

import java.util.Scanner;

public class LCMandGCD {

    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            int testCases = scanner.nextInt();
            while (testCases-- > 0) {
                long number1 = scanner.nextInt();
                long number2 = scanner.nextInt();
                long gcd = computeGCD(number1, number2);
                long lcm = computeLCM(number1, number2, gcd);
                System.out.println(lcm + " " + gcd);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static long computeGCD(long number1, long number2) {
        while (number1 != number2) {
            if (number1 > number2)
                number1 -= number2;
            else
                number2 -= number1;
        }   
        return number2;
    }

    private static long computeLCM(long number1, long number2, long gcd) {
        return (number1*number2)/gcd;
    }

}
LCM(最小公倍数)始终大于或等于两个数字中的较大者。因此,我们将首先通过检查较大的数字是否可以被较小的数字整除来检查较大的数字本身是否是两个数字的LCM,如果是,我们找到了LCM,如果不是,那么我们将把较大的数字增加1,然后再次检查

package com.company;
import java.util.Scanner;

public class Main {

public static void main(String args[]) {
    Scanner scan = new Scanner(System.in);
    System.out.print("Enter the first Number : ");
    int number1 = scan.nextInt();
    System.out.print("Enter the second number : ");
    int number2 =scan.nextInt();

    int multiple;

    if(number1 >= number2) {
        multiple = number1;
    } else {
        multiple = number2;
    }

    Boolean loopContinue = true;

    while(loopContinue) {
        if(multiple % number1 == 0 && multiple % number2 == 0) {
            System.out.println("LCM of Two Numbers is " + multiple);
            loopContinue = false;
        }
        multiple++;
    }
  }
}

听起来像一个作业分配Java还是C++?解决方案可能因语言而异。最好使用
(a/gcd(a,b))*b
避免整数溢出。使用因式分解计算
lcm
比使用
gcd
效率低得多。他的方法实际上是。但是是的,它是有效的。4和8的LCM不是实际上是8,不是4吗?GCD(8,4)得到4,所以(8*4)/4=8,那么问题中的公式可以得到正确的答案吗?LCM必须至少与两个输入值中的较大值一样大(假设所有正数)。呃,是的,固定。GCD和LCM方法密切相关。如果你在素数因子中考虑这两个项,取各自的最小值,然后乘以它们,你就得到了GCD(这里:min(2,3)=2,2x2=4)。取响应的最大值(这里:max(2,3)=3,2x2x2=8),得到LCM。