Решение задач. Proc46-49


proc46-49

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

One thought to “Решение задач. Proc46-49”
  1. 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *