Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2014, 15:10   #1
JellyFilled
 
Регистрация: 18.10.2014
Сообщений: 8
По умолчанию Функция НОД в программе.

Вообще само задание звучит так: Даны 2 натуральных числа n и p, найти все натуральные числа меньшие n и взаимно простые с p.
Можете рассказать как работает функция NOD в программе, пожалуйста.
Код:
uses crt;
function NOD(m,n:integer):integer;
begin
  while m<>n do
  if m>n then m:=m-n else n:=n-m;
  NOD:=m;
end;
var n,p,i,k:integer;
begin
  clrscr;
  repeat
    write('Введите натуральное число n=');
    readln(n);
  until n>2;
  repeat
    write(Введите натуральное число  p=');
    readln(p);
  until p>1;
    writeln('Числа от 2 до ',n-1,',взаимно простые с ',p);
  for i:=1 to n-1 do
  if NOD(i,p)=1 then
    begin
      k:=1;
      write(i,' ')
      end;
    if k=0 then write('Нет чисел, взаимно простых с ',p);
    readln;
end.
JellyFilled вне форума Ответить с цитированием
Старый 18.10.2014, 16:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Наверное ищет наименьший общий делитель.
Механизм можно описать примерно так: Нужно подогнать два числа друг к другу, для чего постепенно эти числа взаимовычитаются друг из друга, пока не поравняются в одно число, которое и будет результатом
Т.е. допустим имеем числа 7 и 2
Из 7 вычитаем 2 = 5
Из 5 вычитаем 2 = 3
Из 3 вычитаем 2 = 1
Теперь уже 2 стало больше. Из 2 вычитаем 1 = 1.
Все. Вычитать больше нечего ибо 1 = 1 - возвращаем эту единицу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.10.2014, 16:47   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

НОД - это НАИБОЛЬШИЙ общий делитель (см. вики).

Цитата:
Наибольшим общим делителем (НОД) для двух целых чисел m и n называется наибольший из их общих делителей.[1] Пример: для чисел 70 и 105 наибольший общий делитель равен 35.

Наибольший общий делитель существует и однозначно определён, если хотя бы одно из чисел m или n не ноль.
Код:
function NOD(m,n:integer):integer;
begin
  while m<>n do
  if m>n then m:=m-n else n:=n-m;
  NOD:=m;
end;

begin
 WriteLn(NOD(70 , 105 )); // выведет 35
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.10.2014, 20:26   #4
JellyFilled
 
Регистрация: 18.10.2014
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
НОД - это НАИБОЛЬШИЙ общий делитель (см. вики).



Код:
function NOD(m,n:integer):integer;
begin
  while m<>n do
  if m>n then m:=m-n else n:=n-m;
  NOD:=m;
end;

begin
 WriteLn(NOD(70 , 105 )); // выведет 35
end.
А можно вопрос по программе.
Вообщем
Код:
for i:=1 to n-1 do
  if NOD(i,p)=1 then
В этой строчке он предполагает, что i=m, а p=n, и если НОД равен 1, то записывает это число? (и я забыл, что начинается так for i:=2, а не 1)
А и всё же, почему в функции NOD'у присваивается именно значение m?
JellyFilled вне форума Ответить с цитированием
Старый 18.10.2014, 20:33   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
и всё же, почему в функции NOD'у присваивается именно значение m?
Можно присваивать и N и M.. Они равны.. Поэтому разницы нет..
Цитата:
В этой строчке он предполагает, что i=m, а p=n, и если НОД равен 1, то записывает это число?
Примерно так
Poma][a вне форума Ответить с цитированием
Старый 18.10.2014, 20:39   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А и всё же, почему в функции NOD'у присваивается именно значение m?
конкрентно в данном алгоритме это совсем не важно.
если вы посмотрите на условие цикла:
Цитата:
Код:
  while m<>n do
  if m>n then m:=m-n else n:=n-m;
  NOD:=m;
то увидите, что цикл по вычитанию из большего меньшего будет выполняться до тех пор, пока m и n не станут равны друг другу.
поэтому, не нравится Вам NOD:=m;
пишите NOD:=n;
это тоже самое в данном случае
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.10.2014, 20:45   #7
JellyFilled
 
Регистрация: 18.10.2014
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
конкрентно в данном алгоритме это совсем не важно.
если вы посмотрите на условие цикла:

то увидите, что цикл по вычитанию из большего меньшего будет выполняться до тех пор, пока m и n не станут равны друг другу.
поэтому, не нравится Вам NOD:=m;
пишите NOD:=n;
это тоже самое в данном случае
Спасибо Вам.
Цитата:
Сообщение от Poma][a Посмотреть сообщение
Можно присваивать и N и M.. Они равны.. Поэтому разницы нет..

Примерно так
И Вам.
JellyFilled вне форума Ответить с цитированием
Старый 18.10.2014, 21:41   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

кстати, для коллекции, вот ещё одна функция, которая делает то же самое, только чуть по другому:
Код:
function GCD(a, b: Integer): Integer;
begin
  while (a<>0) and (b<>0) do 
      if a>b then a:=a mod b else b:=b mod a;
  GCD:=a+b;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль, выбрать правильное обращение к программе (функция) Lizoveta Помощь студентам 3 01.07.2013 00:45
Функция минимума. Разработанные процедуры и функции поместить в отдельном модуле, который использовать в основной программе(Delphi zia Помощь студентам 5 15.12.2012 19:03
[Delphi] Зачем в данной программе нужна функция StrToFloat и FloatToStr? Alsazius Помощь студентам 5 11.12.2012 17:54
Ошибки в программе - функция для работы с множествами X-REY Паскаль, Turbo Pascal, PascalABC.NET 4 26.10.2011 20:48
Процедура-функция на нахождение НОД по теореме Евклида Blueyeska Помощь студентам 1 07.05.2010 21:16