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

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

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

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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)
0
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
20.11.2010, 00:00  [ТС] #3
Я видел на википедии, но никак немогу ввести его в програмный код...
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.11.2010, 06:58 #4
там есть формула, как найти его через НОД, а НОД есть в виде реализации

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.11.2010, 02:24
Ответ Создать тему
Опции темы

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