Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/106: Рейтинг темы: голосов - 106, средняя оценка - 4.69
1 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 112
1

Алгоритм Евклида

19.11.2010, 18:34. Показов 21496. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем.
Задача такова, надо написать программу на С++ для поиска Самого Малого Кратного (СМК) по алгоритму Евклида.
Дано три числа: a, b, c найти их самое малое кратное.
Просьба, чтобы вверху програмы было не
#include <isotream.h>
a
#include <stdio.h>
тоесть чтобы програма была на самом минимальном уровне програмирования.
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2010, 18:34
Ответы с готовыми решениями:

алгоритм евклида
не могу выкупить ничего что происходит и как решить. вот мое задание : : : : Даны натуральные а и...

Алгоритм Евклида
Здравствуйте! Подскажите пожалуйста какие ошибки есть в алгоритме, который я составил? int gcd...

Необычный алгоритм Евклида
Помогите,пожалуйста!Написал програму,не могу найти ,где в ней ошбка.Условие:дано натуральное число...

Расширенный алгоритм Евклида
Дело движется к реализации RSA, но уже на этом этапе возникли проблемы. Дело в том что у меня...

22
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
19.11.2010, 19:30 2
Самое Малое Кратное по-русски называется Наименьшее Общее Кратное (NOK)
Наибольший общий делитель NOD(a,b) вычисляется по алгоритму Евклида - код для этого есть в wikipedia

Дальше верно
NOK(a,b,c)= NOK( NOK(a,b), c )
NOK(a,b)= a*b/NOD(a,b)
0
1 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 112
20.11.2010, 00:00  [ТС] 3
Я видел на википедии, но никак немогу ввести его в програмный код...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.11.2010, 06:58 4
там есть формула, как найти его через НОД, а НОД есть в виде реализации

wiki. НОК
wiki. НОД. реализация
0
1 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 112
20.11.2010, 11:38  [ТС] 5
Спасибо, посижу поколдую)
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
20.11.2010, 12:56 6
Только обрати внимание, что и НОД, и НОК должны быть положительны. В википедии об этом забыли.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.11.2010, 22:48 7
Цитата Сообщение от volovzi
В википедии об этом забыли.
там формула с модулем
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
20.11.2010, 22:56 8
Пример программы там без модуля.
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
21.11.2010, 00:59 9
C
1
2
3
4
5
6
7
8
9
10
11
int Nod(int a, int b)
{ int t;
    if (a < b) { t = a; a = b; b = t; }
    while(a != b) {
      t = a % b;
      if (t==0) break;
      a = b;
      b = t;
    }
    return(b);
}
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
21.11.2010, 01:06 10
Day, у вас та же ошибка — при отрицательных числах на входе НОД будет отрицательным.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.11.2010, 01:07 11
вот с wiki один из примеров
C
1
2
3
4
5
6
7
8
9
int gcd(int a, int b) {
   int c;
   while (b) {
      c = a % b;
      a = b;
      b = c;        
   }
   return abs(a);
 }
и картинка, на которой формула также содержит модуль
Миниатюры
Алгоритм Евклида  
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
21.11.2010, 01:20 12
Цитата Сообщение от volovzi Посмотреть сообщение
Day, у вас та же ошибка — при отрицательных числах на входе НОД будет отрицательным.
Ну так обратитесь к ней через abs
C
1
  int nod = Nod(abs(a), abs(b));
Вообще, для отрицательных чисел операция "%" работает чуток не так, как нам хочется - проверьте.

Добавлено через 7 минут
Слово "ошибка" тут не очень подходит. Пока не определена область определения переменных.
Этак я могу сказать, что для вычисления суммы a и b код
C
1
  s = a + b;
ошибочен, т.к. при достататочно больших a и b s вылезет за границы представления int
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
21.11.2010, 01:42 13
accept, чудесно, что ты нашёл среди неправильных один правильный вариант. А картинка верная, никто не спорит.


Day, НОД же для отрицательных чисел определён, поэтому нет смысла ставить ограничение на входные данные.

В нашем случае
C
1
Nod(abs(int), abs(int))) == abs(Nod(int, int))
поэтому лучше эту операцию запихнуть внутрь функции.

Добавлено через 15 минут
Нужно отметить, что провернуть этот трюк позволяет именно неправильная реализация деления с остатком в языке Си.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.11.2010, 02:10 14
а вариант этот даже деление на ноль проверяет
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
21.11.2010, 02:24 15
accept, он вообще прекрасен. К сожалению, его соседи не таковы.

Но лично мне больше всего нравится вот этот:
C
1
2
3
int gcd (int first, int second) {
    return second == 0 ? abs(first) : gcd(second, first % second);
}
1
1 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 112
21.11.2010, 13:53  [ТС] 16
C
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
31
32
33
34
35
#include <stdio.h>
#include <conio.h>
int main (void)
{
int A, B, R, M, N;
printf ("Enter A\n"); scanf("%d", &A);
printf ("Enter B\n"); scanf("%d", &B);
 
M=A;
N=B;
 
if (M=N)
{
printf ("M=%d\n", M);
}
else 
{
    if (M>N)
{
        R=M-N;
        M=N;
        N=R;
    
}
    else 
    {
        R=M;
        M=N;
        N=R;
 
    }
}
getch ();
return 0;
}
что в ней неправильно, вроде все циклы есть, всё-всё, ну незнаю где влепить printf, подскажите плз)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.11.2010, 15:25 17
M = N
0
1 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 112
21.11.2010, 16:32  [ТС] 18
А как должно быть, подскажите пожалуйста.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.11.2010, 16:36 19
M == N
0
1 / 1 / 1
Регистрация: 28.10.2010
Сообщений: 112
21.11.2010, 17:14  [ТС] 20
Заменил, неработает..
0
21.11.2010, 17:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2010, 17:14
Помогаю со студенческими работами здесь

Визуализировать алгоритм Евклида
Визуализировать алгоритм эвклида

Расширенный алгоритм Евклида
Здравствуйте, форумчане! Подскажите пожалуйста как реализовать такое задание(код самого алгоритма...

Реализовать обобщенный алгоритм Евклида
Ребят,необходимо реализовать обобщенный алгоритм Евклида. Заранее благодарен! Добавлено через 3...

Алгоритм Евклида с использованием рекурсии
Моя реализация алгоритма Евклида с использованием рекурсивной функции. //Program finds greatest...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru