Подтвердить что ты не робот

Каков наиболее эффективный способ вычисления наименьшего общего кратного двух целых чисел?

Каков наиболее эффективный способ вычисления наименьшего общего кратного двух целых чисел?

Я только что придумал это, но это определенно оставляет желать лучшего.

int n=7, m=4, n1=n, m1=m;

while( m1 != n1 ){
    if( m1 > n1 )
        n1 += n;
    else 
        m1 += m;
}

System.out.println( "lcm is " + m1 );
4b9b3361

Ответ 1

Наименьшее общее число (lcm) a и b - это их произведение, деленное на их наибольший общий делитель (gcd) (т.е. lcm(a, b) = ab/gcd(a,b)).

Итак, возникает вопрос, как найти gcd? Евклидовой алгоритм, как правило, вычисляется gcd. Прямая реализация классического алгоритма эффективна, но есть вариации, которые используют бинарную арифметику, чтобы сделать немного лучше. См. Knuth " Искусство компьютерного программирования Том 2," Семинумерные алгоритмы" § 4.5.2.

Ответ 2

Запомнить Наименьшее общее число кратных - это наименьшее целое число, которое кратно каждому из двух или более чисел.

Если вы пытаетесь вычислить LCM из трех целых чисел, выполните следующие действия:

  **Find the LCM of 19, 21, and 42.**

Запишите простую факторизацию для каждого числа. 19 - простое число. Вам не нужно учитывать 19.

21 = 3 × 7
42 = 2 × 3 × 7
19

Повторяйте каждый простой коэффициент наибольшее количество раз, которое оно появляется в любой из простых факторизаций выше.

2 × 3 × 7 × 19 = 798

Наименьшее общее кратное 21, 42 и 19 составляет 798.

Ответ 4

Прежде всего, вам нужно найти наибольший общий делитель

for(int = 1; i <= a && i <= b; i++) {

   if (i % a == 0 && i % b == 0)
   {
       gcd = i;
   }

}

После этого, используя GCD, вы можете легко найти наименьшее общее число, подобное этому

lcm = a / gcd * b;

Ответ 5

Я не знаю, оптимизирован ли он или нет, но, возможно, самый простой:

public void lcm(int a, int b)
{
    if (a > b)
    {
        min = b;
        max = a;
    }
    else
    {
        min = a;
        max = b;
    }
    for (i = 1; i < max; i++)
    {
        if ((min*i)%max == 0)
        {
            res = min*i;
            break;
        }
    }
    Console.Write("{0}", res);
}

Ответ 6

Лучшее решение в C++ ниже без переполнения

#include <iostream>
using namespace std; 
long long gcd(long long int a, long long int b){        
    if(b==0)
        return a;
    return gcd(b,a%b);
}

long long lcm(long long a,long long b){     
    if(a>b)
        return (a/gcd(a,b))*b;
    else
        return (b/gcd(a,b))*a;    
} 

int main()
{
    long long int a ,b ;
    cin>>a>>b;
    cout<<lcm(a,b)<<endl;        
    return 0;
}

Ответ 7

C++ шаблон. Время компиляции

#include <iostream>

const int lhs = 8, rhs = 12;

template<int n, int mod_lhs=n % lhs, int mod_rhs=n % rhs> struct calc {
  calc() { }
};

template<int n> struct calc<n, 0, 0> {
  calc() { std::cout << n << std::endl; }
};

template<int n, int mod_rhs> struct calc<n, 0, mod_rhs> {
  calc() { }
};

template<int n, int mod_lhs> struct calc <n, mod_lhs, 0> {
  calc() { }
};

template<int n> struct lcm {
  lcm() {
    lcm<n-1>();
    calc<n>();
  }
};

template<> struct lcm<0> {
  lcm() {}
};

int main() {
  lcm<lhs * rhs>();
}

Ответ 8

Возьмите последовательные кратные больше из двух чисел, пока результат не будет кратным меньшему.

это может сработать.

   public int LCM(int x, int y)
   {
       int larger  = x>y? x: y,
           smaller = x>y? y: x,
           candidate = larger ;
       while (candidate % smaller  != 0) candidate += larger ;
       return candidate;
   }

Ответ 9

Евклидов код GCD

int findGCD(int a, int b) {
        if(a < 0 || b < 0)
            return -1;

        if (a == 0)
            return b;
        else if (b == 0)
            return a;
        else 
            return findGCD(b, a % b);
    }

Ответ 10

Произведение из 2 чисел равно LCM * GCD или HCF. Поэтому лучший способ найти LCM - найти GCD и разделить продукт с GCD. То есть LCM (a, b) = (a * b)/GCD (a, b).