Напишите процедуру, которая вычисляет наибольший общий делитель и наименьшее общее кратное двух натуральных чисел и возвращает их через изменяемые параметры только через процедуры!
program qq; uses crt; procedure NOD_NOK(n1,n2:integer;var a,b:integer); var m:integer; begin if n1>n2 then m:=n1 else m:=n2; a:=m-1; repeat a:=a+1 until ((a mod n1)=0) and ((a mod n2)=0); while n1<>n2 do if n1>n2 then n1:=n1-n2 else n2:=n2-n1; b:=n1; end; var y,x,a,b:integer; begin repeat writeln('Введите 2 натуральных числа:'); read(x,y); until(x>0)and(y>0); NOD_NOK(x,y,a,b); writeln('NOD(',x,',',y,')=',b); writeln('NOK(',x,',',y,')=',a); end.
// Внимание! Если программа не работает, обновите версию!
procedure NOD_NOK(a,b:integer; var NOD,NOK:integer);
begin
(var p,var q):=(a,b);
while q>0 do (p,q):=(q,p mod q);
NOD:=p; NOK:=a*b div NOD
end;
begin
var a,b,c,d:integer; Read(a,b);
NOD_NOK(a,b,c,d);
Writeln('НОД=',c,', НОК=',d)
end.
Пример
138 42
НОД=6, НОК=966
program qq;
uses crt;
procedure NOD_NOK(n1,n2:integer;var a,b:integer);
var m:integer;
begin
if n1>n2 then m:=n1 else m:=n2;
a:=m-1;
repeat
a:=a+1
until ((a mod n1)=0) and ((a mod n2)=0);
while n1<>n2 do
if n1>n2 then n1:=n1-n2 else n2:=n2-n1;
b:=n1;
end;
var y,x,a,b:integer;
begin
repeat
writeln('Введите 2 натуральных числа:');
read(x,y);
until(x>0)and(y>0);
NOD_NOK(x,y,a,b);
writeln('NOD(',x,',',y,')=',b);
writeln('NOK(',x,',',y,')=',a);
end.