Страница 1 из 1

Паскаль.Нахождение НОД и НОК.

Добавлено: 21 окт 2008, 20:53
RAITER

Код: Выделить всё

Program nodnok;
var a,b:integer;
function NOD(x,y:integer):integer;
Begin
If x<>0 then NOD:=NOD(y mod x,x) else NOD:=y; (1)
End;
function NOK(x,y:integer):integer;
Begin
NOK:=(x div NOD (x,y))*y; (2)
end;
Begin
Write ('Vvedite a i b:');
Readln(a,b);
Writeln('NOD',a,'i',b,'=',NOD(a,b));  (3)
Writeln('NOK',a,'i',b,'=',NOK(a,b));   (4)
Readln;
End.
Здравствуйте, прокоментируйте пожалуйста подробно строчки помеченый цифрами, и не могли бы ввы расказать как дествует эта программа?

Re: Паскаль.Нахождение НОД и НОК.

Добавлено: 21 окт 2008, 21:45
Naeel Maqsudov
Что? Препод не принимает решение задачи? ;)
Вот Вам кто-то подсуропил. :) Написал рекурсивную функцию.

(1) рекурсивный поиск Н.О.Д
Пусть была вызвана функция NOD(55,23) 55 - это X, а 23 - это Y
Если бы было X=0 то результатом функции было бы число Y (т.е. NOD(0,4) = 0, NOD(0,77)=77...), и все бы закончилось. Но X<>0.
Тогда функция вызывает сама себя, но параметры уже будут другими:
Вместо 55 используется остаток от деления Y на X (т.е. 55 mod 23, что равно 9),
Вместо 23 передается наоборот 55
Т.е. получается, что NOD(55,23)=NOD(9,55), и все надо начинать сначала.
Только теперь 9 - это X, а 55 - Y
...
Через некоторое время обязательно получится что
NOD(55,23)=NOD(9,55)=NOD(что-то,что-то)=....=NOD(0,что-то)
и вот это последнее "что-то" и будет результатом вычислений

(2)
Тут все проще. Если знать Н.О.Д., то Н.О.К находится просто по формуле, которая в этой строке и написана.


(3) и (4) вычисляют и сразу печатают результат на экран. Заодно оформляя его красиво. Мол, то-то равно тому-то, а это - этому. Вот и все.