Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.92
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
#1

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

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

Привет всем.
Задача такова, надо написать программу на С++ для поиска Самого Малого Кратного (СМК) по алгоритму Евклида.
Дано три числа: a, b, c найти их самое малое кратное.
Просьба, чтобы вверху програмы было не
#include <isotream.h>
a
#include <stdio.h>
тоесть чтобы програма была на самом минимальном уровне програмирования.
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2010, 18:34     Алгоритм Евклида
Посмотрите здесь:

Алгоритм Евклида - C++
Здравствуйте! Подскажите пожалуйста какие ошибки есть в алгоритме, который я составил? int gcd (int a, int b) { int t; if...

алгоритм евклида - C++
не могу выкупить ничего что происходит и как решить. вот мое задание : : : : Даны натуральные а и b, не равные 0 одновременно. Найти d =...

Необычный алгоритм Евклида - C++
Помогите,пожалуйста!Написал програму,не могу найти ,где в ней ошбка.Условие:дано натуральное число n ичислаа1,а2,а3,...,аn,которые вводятся...

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

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

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

Алгоритм Евклида. Переведите с Паскаля на С++ - C++
begin g 0 : = b; g 1 : = a; i : = 1 while g i ! = 0 do begin ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 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)
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
20.11.2010, 00:00  [ТС]     Алгоритм Евклида #3
Я видел на википедии, но никак немогу ввести его в програмный код...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.11.2010, 06:58     Алгоритм Евклида #4
там есть формула, как найти его через НОД, а НОД есть в виде реализации

wiki. НОК
wiki. НОД. реализация
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
20.11.2010, 11:38  [ТС]     Алгоритм Евклида #5
Спасибо, посижу поколдую)
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
20.11.2010, 12:56     Алгоритм Евклида #6
Только обрати внимание, что и НОД, и НОК должны быть положительны. В википедии об этом забыли.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.11.2010, 22:48     Алгоритм Евклида #7
Цитата Сообщение от volovzi
В википедии об этом забыли.
там формула с модулем
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
20.11.2010, 22:56     Алгоритм Евклида #8
Пример программы там без модуля.
Day
1154 / 959 / 57
Регистрация: 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);
}
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.11.2010, 01:06     Алгоритм Евклида #10
Day, у вас та же ошибка — при отрицательных числах на входе НОД будет отрицательным.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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);
 }
и картинка, на которой формула также содержит модуль
Миниатюры
Алгоритм Евклида  
Day
1154 / 959 / 57
Регистрация: 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
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.11.2010, 01:42     Алгоритм Евклида #13
accept, чудесно, что ты нашёл среди неправильных один правильный вариант. А картинка верная, никто не спорит.


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

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

Добавлено через 15 минут
Нужно отметить, что провернуть этот трюк позволяет именно неправильная реализация деления с остатком в языке Си.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2010, 02:10     Алгоритм Евклида #14
а вариант этот даже деление на ноль проверяет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2010, 02:24     Алгоритм Евклида
Еще ссылки по теме:

Алгоритм Евклида с использованием рекурсии - C++
Моя реализация алгоритма Евклида с использованием рекурсивной функции. //Program finds greatest common divisor of two natural numbers....

Алгоритм Евклида + системы счисления - C++
Доброго времени суток! На С++ работаю пару недель, до этого несколько месяцев на Фортране. Была предложена такя задача: Найдите...

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

RSA, Расширенный алгоритм Евклида. Код на С++ - C++
Доброго времени суток ,форумчане) тут такой вопрос: есть Расширенный алгоритм Евклида. ( кто сможет простым языком разъяснить ,как...

Наименьший общий делитель. Алгоритм Евклида. - C++
Наименьший общий делитель. Алгоритм Евклида. int protect(int maxnum,int minnum); int _tmain(int &amp;n, int &amp;m); int nod (int n,...


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

Или воспользуйтесь поиском по форуму:
volovzi
267 / 169 / 8
Регистрация: 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);
}
Yandex
Объявления
21.11.2010, 02:24     Алгоритм Евклида
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru