Предмет: Информатика, автор: Grace1234

СРОЧНО!
Найти НОД для последовательности чисел (пользователь вводит целые числа, пока не введёт 0. Как найти: например НОД(a,b,c) это НОД(НОД(a,b), c) для последовательности из трёх чисел. Как только введён 0, программа должна выдать результат (одно целое число).
Пример входных данных: 124, 256, 768, 2, 0; пример выходных данных: 2.
Язык: Pascal

Ответы

Автор ответа: shpaler2k16
1

Ответ:

const size = 100;

var MAS:array [1..size] of integer;

   tmp, biggest, realsize : integer;

   res: integer;

begin

 writeln('Ввод данных:');

 tmp:= 1;

 for realsize:= 1 to size do

 begin

   read(tmp);

   if tmp = 0 then break;

   MAS[realsize]:= tmp;

   if MAS[realsize] > biggest then

     biggest:= MAS[realsize];

 end;

 realsize-=1;

 writeln('Mas size: ', realsize);

 for var i:= 1 to biggest do

 begin

 tmp:= 1;

   for var j:= 1 to realsize do

     if MAS[j] mod i <> 0 then

     begin

       tmp:=0;

       break

     end;

   if tmp = 1 then

     res:= i;

 end;

 writeln('RES: ', res);

end.

Объяснение:

Программа работает с натуральными числами.

Ищем наибольший элемент(biggest), объявляем переменную цикла, бегаем от 1 до biggest, вычисляем остаток от деления каждого элемента массива во вложенном цикле. Если остаток не равен нулю, то это значение нам не подходит(tmp = 0), если tmp = 1 , тогда пишем I в res. Конец цикла, НОД в res.

переменная realsize нужна для того, чтобы не попадать на пустые поля массива(не умею в динамическую память в паскале).


Koljisto: А что будет если переполниться буфер в 100?
Koljisto: Тут не сказано сколько элементов
Koljisto: Также программа не оптимизирована для 3 чисел, 97 ячеек будут пустыми храниться
Koljisto: 3 в пример
shpaler2k16: да я ж сказал, что не шарю за динам. память в паскале. Она вообще не оптимизирована.
shpaler2k16: А так, получается, просто дорисовать SetLength() в цикл ввода и все.
Koljisto: Советую изучить, потому что это полезно всегда.
Автор ответа: Koljisto
1

Для сколько угодно чисел:

function GCD(u: integer; v: integer):integer;

begin

var r:integer;

  while ( v <> 0) do

    begin

      r := u mod v;

      u := v;

      v := r;

    end;

    Result:=u;

end;

function findGCD(arr:array of integer; n:integer):integer;

begin

 var res:=arr[0];

 for var i:=0 to n do

 begin

   res:=gcd(arr[i],res);

 end;

 Result:=res;

end;

Begin

 var i: integer;

 var arr:array of integer;

 SetLength(arr, 1);

 var num:=ReadInteger('Введите число');

 while (num<>0) do

 begin

   SetLength(arr, i+1);

   arr[i]:=num;

   i+=1;

   num:=ReadInteger('Введите число');

 end;

 SetLength(arr, i);

 var gcd_n:=findGCD(arr,arr.Length-1);

 gcd_n.Println;

end.

Похожие вопросы
Предмет: Алгебра, автор: klopsklops243