Приветствуем читателей нашего сайта. Сегодня мы решаем 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.