
Приветствуем читателей нашего сайта. Сегодня мы решаем proc46-49.
Proc46-49
Proc46. Описать функцию NOD2(A, B) целого типа, находящую наибольший общий делитель двух целых положительных чисел A и B, используя алгоритм Евклида:
НОД(A, B) = НОД(B, A mod B), если B ≠ 0; НОД(A, 0) = A,
где «mod» обозначает операцию взятия остатка от деления. С помощью NOD2 найти наибольшие общие делители пар (A, B), (A, C), (A, D), если даны числа A, B, C, D.
Используем материалэтого урока.
program proc46;
function NOD2(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;
NOD2 := a + b
end;
var
a, b, c, d: integer;
begin
write('A = ');
readln(a);
write('B = ');
readln(b);
write('C = ');
readln(c);
write('D = ');
readln(d);
writeln('NOD(', a, ', ', b, ') = ', NOD2(a, b));
writeln('NOD(', a, ', ', c, ') = ', NOD2(a, c));
writeln('NOD(', a, ', ', d, ') = ', NOD2(a, d));
end.
Proc47. Используя функцию NOD2 (см. Proc46), описать процедуру Frac1(a, b, p, q), преобразующую дробь a/b к несократимому виду p/q (все параметры процедуры — целого типа, a и b — входные, p и q — выходные). Знак результирующей дроби p/q приписывается числителю (т. е. q > 0). С помощью Frac1 найти несократимые дроби, равные a/b + c/d, a/b + e/f, a/b + g/h (числа a, b, c, d, e, f, g, h даны).
program proc47;
function NOD2(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;
NOD2 := a + b
end;
procedure Frac1(a, b: integer; var p, q: integer);
begin
p := abs(a) div NOD2(abs(a), abs(b));
q := abs(b) div NOD2(abs(a), abs(b));
{Числитель отрицательный, если а и b - противоположные знаки }
if a * b < 0 then p := -p
end;
var
a, b, c, d, e, f, g, h, p, q: integer;
begin
write('Введите целые чиcла (8) a, b, c, d, e, f, g, h: ');
readln(a, b, c, d, e, f, g, h);
Frac1(a * d + b * c, b * d, p, q);
writeln(a, '/', b, ' + ', c, '/', d, ' = ', p, '/', q);
Frac1(a * f + b * e, b * f, p, q);
writeln(a, '/', b, ' + ', e, '/', f, ' = ', p, '/', q);
Frac1(a * h + b * g, b * h, p, q);
writeln(a, '/', b, ' + ', g, '/', h, ' = ', p, '/', q);
end.
Proc48. Наименьшее общее кратное двух целых положительных чисел A и B равно (A·B)/НОД(A, B)), где НОД(A, B) — наибольший общий делитель A и B. Используя функцию NOD2 (см. Proc46), описать функцию NOK2(A, B) целого типа, находящую наименьшее общее кратное чисел A и B. С помощью NOK2 найти наименьшие общие кратные пар (A, B), (A, C), (A, D), если даны числа A, B, C, D.
program proc48;
function NOD2(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;
NOD2 := a + b
end;
function NOK2(a, b: integer): integer;
begin
NOK2 := a * (b div NOD2(a, b))
end;
var
a, b, c, d: integer;
begin
write('A = ');
readln(a);
write('B = ');
readln(b);
write('C = ');
readln(c);
write('D = ');
readln(d);
writeln('NOK(', a, ', ', b, ') = ', NOK2(a, b));
writeln('NOK(', a, ', ', c, ') = ', NOK2(a, c));
writeln('NOK(', a, ', ', d, ') = ', NOK2(a, d));
end.Proc49. Учитывая соотношение НОД(A, B, C) = НОД(НОД(A, B), C) и используя функцию NOD2 (см. Proc46), описать функцию NOD3(A, B, C) целого типа, находящую наибольший общий делитель трех целых положительных чисел A, B, C. С помощью NOD3 найти наибольшие общие делители троек (A, B, C), (A, C, D) и (B, C, D), если даны числа A, B, C, D.
program proc49;
function NOD2(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;
NOD2 := a + b
end;
function NOD3(a, b, c: integer): integer;
begin
NOD3 := NOD2(NOD2(a, b), c)
end;
var
a, b, c, d: integer;
begin
write('A = ');
readln(a);
write('B = ');
readln(b);
write('C = ');
readln(c);
write('D = ');
readln(d);
writeln('NOD(', a, ', ', b, ', ', c, ') = ', NOD3(a, b, c));
writeln('NOD(', a, ', ', c, ', ', d, ') = ', NOD3(a, c, d));
writeln('NOD(', b, ', ', c, ', ', d, ') = ', NOD3(b, c, d));
end.
На сегодня все! Если у вас возникли проблемы с решением задач proc46-49 или с любыми другими задачами, то напишите их в комментариях.
program Proc46;
function GCD_(a, b: integer): integer;
begin
if b = 0 then result := a
else result := GCD_(b, a mod b)
end;
begin
var a := ReadArrInteger(4);
Write(GCD_(a[0], a[1]), NewLine,
GCD_(a[0], a[2]), NewLine,
GCD_(a[0], a[3]))
end.