Задача:
Найти наименьшее общее кратное для всех элементов массива — минимальное число, которое делится на все элементы массива без остатка. Также, найти НОД всех элементов массива.
Решение:
Вот тут приведены алгоритмы расчета НОК и НОД для двух чисел. Ясно, что наиболее эффективный алгоритм расчета НОК двух чисел — это произведение чисел поделить на их НОД. По содержимому статьи ясно что НОК(а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; }
0 / 0 / 0 Регистрация: 20.04.2010 Сообщений: 17 |
|
1 |
|
Найти наибольший общий делитель всех элементов массива20.01.2012, 04:15. Показов 9034. Ответов 11
Такая задача: Найти наибольший общий делитель всех элементов массива (на который они все делятся без остатка).
0 |
41 / 41 / 36 Регистрация: 23.11.2006 Сообщений: 151 |
|
20.01.2012, 08:46 |
2 |
Достаточно одного исходника написанного на любом С++ компилляторе. Подожди немного, сейчас накидаю программку.
0 |
diagon Higher 1953 / 1219 / 120 Регистрация: 02.05.2010 Сообщений: 2,925 Записей в блоге: 2 |
||||
20.01.2012, 09:57 |
3 |
|||
1 |
HackSign 41 / 41 / 36 Регистрация: 23.11.2006 Сообщений: 151 |
||||
20.01.2012, 11:02 |
4 |
|||
1 |
0 / 0 / 0 Регистрация: 20.04.2010 Сообщений: 17 |
|
20.01.2012, 12:07 [ТС] |
5 |
Ребят.Подскажите,как создать новый проэкт..чуть я запутался((
0 |
co6ak Кошковед 521 / 509 / 63 Регистрация: 12.04.2010 Сообщений: 1,390 |
||||
20.01.2012, 12:28 |
6 |
|||
1 |
41 / 41 / 36 Регистрация: 23.11.2006 Сообщений: 151 |
|
20.01.2012, 13:13 |
7 |
Дык в Visual studio 2008 довольно просто. выбираешь язык программирования, открывается среда разработки, далее, в меню Файл, создаешь проект, как только проект у тебя открылся, добавляешь в него исходник и компилишь. файловый обозреватель там чтоли, file browser. я уж давно использую Dev-C++. может подзабыл чуток. ну, в общем как-то так.
1 |
Shman 6 / 6 / 6 Регистрация: 30.04.2012 Сообщений: 216 |
||||||||||||
25.05.2012, 13:02 |
8 |
|||||||||||
HackSign, что вычисляет первый цикла вашей программы?
Оссобенно интересует цикл:
Если заполнить массив размером 5 чисами: 1, 2, 3, 4, 5. , то НОД = 8, что ест-но неверно. Так зачем этот цикл нужен? Что он делает? Добавлено через 1 час 6 минут
0 |
MrGluck Форумчанин 8194 / 5044 / 1437 Регистрация: 29.11.2010 Сообщений: 13,453 |
||||
25.05.2012, 13:23 |
9 |
|||
Не верно с отрицательными числами.
0 |
Shman 6 / 6 / 6 Регистрация: 30.04.2012 Сообщений: 216 |
||||
25.05.2012, 14:27 |
10 |
|||
Еще вариант:
Разультат: 8. Однако неверно, т.к. 8 не делится на 6 без остатка. Поогите найти ошибку.
0 |
Shman 6 / 6 / 6 Регистрация: 30.04.2012 Сообщений: 216 |
||||
27.05.2012, 11:15 |
11 |
|||
Программа выдает, что общих делителей не найдено, хотя здесь НОД = 2. Где допущена ошибка? Интересно, что когда я уменьшаю массив до 3 элементов и ввожу 2, 4, 8, то НОД находится верно (НОД=2).
0 |
Shman 6 / 6 / 6 Регистрация: 30.04.2012 Сообщений: 216 |
||||
31.05.2012, 21:07 |
12 |
|||
Кажется нашел в этом форуме решение другими словами .
Вот только надо подумать как прикрутить работу с отрицательными числами и обойти деление на 0.
0 |
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
In this article, we are given two or more numbers/array of numbers and the task is to find the GCD of the given numbers/array elements in JavaScript.
Examples:
Input : arr[] = {1, 2, 3} Output : 1 Input : arr[] = {2, 4, 6, 8} Output : 2
The GCD of three or more numbers equals the product of the prime factors common to all the numbers, but it can also be calculated by repeatedly taking the GCD of pairs of numbers.
gcd(a, b, c) = gcd(a, gcd(b, c)) = gcd(gcd(a, b), c) = gcd(gcd(a, c), b)
For an array of elements, we do the following. We will also check for the result if the result at any step becomes 1 we will just return 1 as gcd(1, x) = 1.
result = arr[0] For i = 1 to n-1 result = GCD(result, arr[i])
Below is the implementation of the above approach.
Example: In this example, we will find the GCD of the elements of an array using Javascript.
Javascript
<script>
function
gcd(a, b) {
if
(a == 0)
return
b;
return
gcd(b % a, a);
}
function
findGCD(arr, n) {
let result = arr[0];
for
(let i = 1; i < n; i++) {
result = gcd(arr[i], result);
if
(result == 1) {
return
1;
}
}
return
result;
}
let arr = [2, 4, 6, 8, 16];
let n = arr.length;
console.log(findGCD(arr, n));
</script>
Output:
2
Last Updated :
03 Jan, 2023
Like Article
Save Article
Как найти НОК или НОД в python 3.9 в списке из n кол-ва чисел? (Ввод чисел пользователем)
(н: math.gcd([1 , 2 , 3])
задан 26 окт 2021 в 16:22
4
список из нескольких чисел можно получить следующим образом:
data = list(map(int, input().split()))
весь код таким образом будет выглядеть так:
import math
data = list(map(int, input().split()))
gcd = math.gcd(*data)
lcm = math.lcm(*data)
print(gcd, lcm)
ответ дан 26 окт 2021 в 16:42
ZhiharZhihar
36.9k4 золотых знака25 серебряных знаков67 бронзовых знаков
1
print ('a = ', end = '')
a = int (input ())
print ('b = ', end = '')
b = int (input ())
p = a * b
while a != 0 and b != 0:
if a > b:
a = a % b
else:
b = b % a
nod = a + b
nok = p // nod
print ('GCD:', nok)
print ('LDM:', nod)
ответ дан 26 окт 2021 в 16:29
2
НОД и НОК для массива
Напомню, что НОД (наибольший общий делитель, GCD) для натуральных чисел A и B – максимальное из чисел, на которые A и B делятся без остатка, НОК (наименьшее общее кратное, LCM) – минимальное из чисел, которые делятся на A и B без остатка. Можно реализовать простой и удобный алгоритм поиска НОД и НОК для пары чисел, а для массива натуральных чисел у народа почему-то вызвало затруднения. Между тем, вот такое решение кажется мне простым и правильным:
#include <stdio.h> //Реализация для 2 чисел long int nod (int x, int y) { return (x?nod(y%x,x):y); } long int nok (int x, int y) { return x*y/nod(x,y); } //и вернуть nok(x,y) или nod(x,y) void main () { const int n=5; int a[n]={24,36,144,48,72},i; //НОД для массива: long int nd=a[0]; for (i=1; i<n; i++) nd=nod((nd<a[i]?nd:a[i]),(nd<a[i]?a[i]:nd)); printf ("nNOD=%ld",nd); //НОК для массива: long int nk=1; for (i=0; i<n; i++) nk=nok(nk,a[i]); printf ("nNOK=%ld",nk); }
Или с выводом через <iostream>
:
#include <iostream> using namespace std; long int nod(long int x, long int y) { return (x ? nod(y % x, x) : y); } long int nok(long int x, long int y) { return x * y / nod(x, y); } int main() { const int n = 5; long int a[n] = { 24, 36, 144, 48, 72 }, i; //НОД для массива: long int nd = a[0]; for (i = 1; i < n; i++) nd = nod((nd < a[i] ? nd : a[i]), (nd < a[i] ? a[i] : nd)); cout << "NOD = " << nd << endl; //НОК для массива: long int nk = 1; for (i = 0; i < n; i++) nk = nok(nk, a[i]); cout << "NOK = " << nk << endl; return 0; }
P.S. Начиная со стандарта C++17, можно воспользоваться стандартными средствами, смотрите в комментарии к программе как подключить компиляцию стандарта C++17 в консольном проекте Visual Studio 2019.
//Включить в свойствах проекта поддержку стандарта C++17: // Project, Properties, C/C++, Language, C++ Language Standard, ISO C++17 (/std:c++17) #include <iostream> #include <numeric> using namespace std; int main() { int n = 24, m = 36; cout << gcd(n, m) << endl; //НОД, https://en.wikipedia.org/wiki/Greatest_common_divisor cout << lcm(n, m) << endl; //НОК, https://en.wikipedia.org/wiki/Least_common_multiple return 0; }
03.12.2012, 08:46 [17053 просмотра]
К этой статье пока нет комментариев, Ваш будет первым