Наименьшее общее кратное
Наименьшее общее кратное (НОК) двух целых чисел m и n есть наименьшее натуральное число, которое делится на m и n без остатка.
Зная наибольший общий делитель (НОД) двух целых чисел m и n, их наименьшее общее кратное можно вычислить по такой формуле:
НОК = m * n / НОД (m, n)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std;
// Наибольший общий делитель
int NOD(int n1, int n2)
{
int div;
if (n1 == n2) return n1;
int d = n1 – n2;
if (d < 0) {
d = -d; div = NOD(n1, d);
} else
div = NOD(n2, d);
return div;
}
// Наименьшее общее кратное
int NOK(int n1, int n2)
{
return n1*n2 / NOD(n1, n2);
}
int main()
{
int n1, n2;
cout << “n1=”;
cin >> n1;
cout << “n2=”;
cin >> n2;
cout << NOK(n1, n2);
cin.get(); cin.get();
return 0;
}
Результат выполнения
Назад: Алгоритмизация
Задача:
Найти наименьшее общее кратное для всех элементов массива — минимальное число, которое делится на все элементы массива без остатка. Также, найти НОД всех элементов массива.
Решение:
Вот тут приведены алгоритмы расчета НОК и НОД для двух чисел. Ясно, что наиболее эффективный алгоритм расчета НОК двух чисел — это произведение чисел поделить на их НОД. По содержимому статьи ясно что НОК(а1, а2, а3, ... аN)
равен НОК(НОК(НОК(А1, А2), А3)..., АN)
. Таким образом, для расчета НОК массива чисел надо многократно расчитывать НОД двух чисел, реализация этой функции на С++ взята тут.
Реализация на Си (функции чуть-чуть изменены, так как добавлена самописная функция swap):
#include <stdio.h> #include <stdlib.h> void read_array(int n, int** values) { for (int i = 0; i < n; ++i) { printf("values[%d] = ", i); scanf("%d", &((*values)[i])); } } void print_array(int n, int* values) { for (int i = 0; i < n; ++i) { printf("values[%d] = %dn", i, values[i]); } } void swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } int gcd(int a, int b) { if (a < b) { swap(&a, &b); } while (a % b != 0) { a = a % b; swap(&a, &b); } return b; } int gcd_n(int n, int* values) { if (n == 0) return -1; if (n == 1) return values[0]; int gcd_value = gcd(values[0], values[1]); for (int i = 2; i < n; ++i) { gcd_value = gcd(gcd_value, values[i]); } return gcd_value; } int lcm(int a, int b) { return (a*b)/gcd(a, b); } int lcm_n(int n, int* values) { if (n == 0) return -1; if (n == 1) return values[0]; int lcm_value = lcm(values[0], values[1]); for (int i = 2; i < n; ++i) { lcm_value = lcm(lcm_value, values[i]); } return lcm_value; } int main() { int n; int *values; printf("n: "); scanf("%d", &n); values = malloc(sizeof(int) * n); read_array(n, &values); printf("lcm: %d", lcm_n(n, values)); free(values); return 0; }
В данном уроке мы узнаем, как найти наименьшее общее кратное (НОК) и наибольший общий делитель (НОД) с помощью языка программирования Python.
Но прежде чем мы начнем, давайте разберем, что обозначает Least Common Multiple (LCM) — наименьшее общее кратное.
НОК: наименьшее общее кратное
Это понятие арифметики и системы счисления. НОК двух целых чисел a и b обозначается НОК(a,b). Это наименьшее натуральное число, которое делится и на «а», и на «b».
Например: у нас есть два целых числа 4 и 6. Найдем НОК:
- Кратные 4:
4, 8, 12, 16, 20, 24, 28, 32, 36,... and so on...
- Кратные 6:
6, 12, 18, 24, 30, 36, 42,... and so on....
Общие кратные 4 и 6 — это просто числа, которые есть в обоих списках:
12, 24, 36, 48, 60, 72,.... and so on....
НОК — это наименьший общий множитель, поэтому он равен 12.
Поскольку мы поняли основную концепцию НОК, давайте рассмотрим следующую программу для нахождения НОК заданных целых чисел.
Пример:
# defining a function to calculate LCM def calculate_lcm(x, y): # selecting the greater number if x > y: greater = x else: greater = y while(True): if((greater % x == 0) and(greater % y == 0)): lcm = greater break greater += 1 return lcm # taking input from users num1 = int(input("Enter first number: ")) num2 = int(input("Enter second number: ")) # printing the result for the users print("The L.C.M. of", num1,"and", num2,"is", calculate_lcm(num1, num2))
Выход:
Enter first number: 3 Enter second number: 4 The L.C.M. of 3 and 4 is 12
Объяснение:
Эта программа сохраняет два числа в num1 и num2 соответственно. Эти числа передаются в функцию calculate_lcm(). Функция возвращает НОК двух чисел.
Внутри функции мы сначала определили большее из двух чисел, поскольку наименьшее общее кратное может быть больше или равно наибольшему числу. Затем мы используем бесконечный цикл while, чтобы перейти от этого числа и дальше.
На каждой итерации мы проверяли, идеально ли делят оба числа число. Если это так, мы сохранили число как НОК и вышли из цикла. В противном случае число увеличивается на 1, и цикл продолжается.
НОД: наибольший общий делитель
В этом разделе мы разберем, как найти Highest Common Factor (HCF) — наибольший общий делитель (НОД) в языке программирования Python.
Наибольший общий делитель двух или более целых чисел, когда хотя бы одно из них не равно нулю, является наибольшим положительным целым числом, которое без остатка делит целые числа. Например, НОД 8 и 12 равен 4.
Например:
У нас есть два целых числа 8 и 12. Найдем наибольший общий делитель.
- Делители числа 8:
1, 2, 4, 8
- Делители числа 12:
1, 2, 3, 4, 6, 12
НОД 8 и 12 равны 4.
Теперь давайте рассмотрим пример, основанный на нахождении НОД двух заданных чисел.
Пример:
# defining a function to calculate HCF def calculate_hcf(x, y): # selecting the smaller number if x > y: smaller = y else: smaller = x for i in range(1,smaller + 1): if((x % i == 0) and(y % i == 0)): hcf = i return hcf # taking input from users num1 = int(input("Enter first number: ")) num2 = int(input("Enter second number: ")) # printing the result for the users print("The H.C.F. of", num1,"and", num2,"is", calculate_hcf(num1, num2))
Выход:
Enter first number: 8 Enter second number: 12 The H.C.F. of 8 and 12 is 4
Объяснение:
В приведенном выше фрагменте кода два целых числа, хранящиеся в переменных num1 и num2, передаются в функцию calculate_hcf(). Функция вычисляет НОД для этих двух чисел и возвращает его.
Внутри функции мы должны определить меньшее число, поскольку НОД может быть меньше или равен наименьшему числу. Затем мы использовали цикл for, чтобы перейти от 1 к этому числу.
На каждой итерации мы должны проверять, точно ли число делит оба входных числа. Если это так, мы должны сохранить число как НОД. По завершении цикла мы получаем наибольшее число, которое идеально делит оба числа.
1196-1017cookie-checkНахождение НОК и НОД в Python — примеры
Примеры различных способов вычисления НОК (наименьшего общего кратного) двух целых чисел с использованием циклов и операторов принятия решений.
НОК в C++ двух целых чисел a и b – это наименьшее положительное целое число, которое делится как на a, так и на b .
#include <iostream> using namespace std; int main() { int n1, n2, max; cout << "Enter two numbers: "; cin >> n1 >> n2; // maximum value between n1 and n2 is stored in max max = (n1 > n2) ? n1 : n2; do { if (max % n1 == 0 max % n2 == 0) { cout << "LCM = " << max; break; } else ++max; } while (true); return 0; }
Enter two numbers: 12 18 LCM = 36
В приведенной выше программе пользователя просят ввести два целых числа n1 и n2, и наибольшее из этих двух чисел сохраняется в max .
Проверяется, делится ли max на n1 и n2 , если он делится на оба числа, печатается max и цикл завершается.
Если нет, значение max увеличивается на 1, и тот же процесс продолжается до тех пор, пока max не станет делиться как на n1, так и на n2 .
Пример 2
LCM = (n1 * n2) / HCF
#include <iostream> using namespace std; int main() { int n1, n2, hcf, temp, lcm; cout << "Enter two numbers: "; cin >> n1 >> n2; hcf = n1; temp = n2; while(hcf != temp) { if(hcf > temp) hcf -= temp; else temp -= hcf; } lcm = (n1 * n2) / hcf; cout << "LCM = " << lcm; return 0; }
Читайте также
- 👉 Преобразование восьмеричного числа в десятичное и наоборот в C++
- 👉 Преобразование двоичного числа в восьмеричное и наоборот в C++
- 👉 Как перевернуть строку в C++
Как найти наименьшее общее кратное двух чисел?
Есть функция, которая принимает два числа, например 36 и 27. Как найти наименьшее общее кратное этих чисел?
-
Вопрос заданболее двух лет назад
-
2301 просмотр
Вроде так:
function gcd(n, m) {
return m == 0 ? n : gcd(m, n % m);
}
function nok(n, m) {
return n * m / gcd(n, m);
}
console.log(nok(36, 27));
Пригласить эксперта
Вот прога, находящая НОК скольких угодно чисел:
let lcm = function(...x) {
let j = Math.max.apply(null, x);
while(true){
if(x.every((b)=>j%b==0)) {
return j; break;
}
else j++;
}
}
И ради забавы НОД:
let gcd = function(...x) {
let j = Math.min.apply(null, x);
while(j >= 1){
if(x.every((b)=>b%j==0)) {
return j; break;
}
else j--;
}
}
-
Показать ещё
Загружается…
21 мая 2023, в 01:51
500 руб./за проект
20 мая 2023, в 23:39
10000 руб./за проект
20 мая 2023, в 22:30
500 руб./за проект