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