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

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

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

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

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

Привет всем.
Задача такова, надо написать программу на С++ для поиска Самого Малого Кратного (СМК) по алгоритму Евклида.
Дано три числа: a, b, c найти их самое малое кратное.
Просьба, чтобы вверху програмы было не
#include <isotream.h>
a
#include <stdio.h>
тоесть чтобы програма была на самом минимальном уровне програмирования.
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт С++
7155 / 3295 / 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
4819 / 3239 / 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
4819 / 3239 / 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
4819 / 3239 / 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
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2010, 02:10     Алгоритм Евклида #14
а вариант этот даже деление на ноль проверяет
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);
}
AndreyZ01
1 / 1 / 0
Регистрация: 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, подскажите плз)
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2010, 15:25     Алгоритм Евклида #17
M = N
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
21.11.2010, 16:32  [ТС]     Алгоритм Евклида #18
А как должно быть, подскажите пожалуйста.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.11.2010, 16:36     Алгоритм Евклида #19
M == N
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2010, 17:14     Алгоритм Евклида
Еще ссылки по теме:

C++ алгоритм евклида
Алгоритм Евклида C++
Расширенный алгоритм Евклида C++
Алгоритм Евклида. Переведите с Паскаля на С++ C++
C++ Реализовать обобщенный алгоритм Евклида

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

Или воспользуйтесь поиском по форуму:
AndreyZ01
1 / 1 / 0
Регистрация: 28.10.2010
Сообщений: 112
21.11.2010, 17:14  [ТС]     Алгоритм Евклида #20
Заменил, неработает..
Yandex
Объявления
21.11.2010, 17:14     Алгоритм Евклида
Ответ Создать тему
Опции темы

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