Думаю нет большой разницы между процедурой и функцией, просто функция куда удобнее.
Для нахождения нода используется алгоритм Эвклида
//PascalABC.Net
function NOD(A, B: integer): integer;
begin
while A <> B do
if A > B then A := A - B else B := B - A;
NOD := A;
end;
procedure pNOD(A, B: integer; var NOD: integer);
begin
while A <> B do
if A > B then A := A - B else B := B - A;
NOD := A;
end;
begin
var a: Array of integer := (16, 32, 40, 64, 80, 128);
var n := a[low(a)];
for var i := low(a) to high(a) do
pNOD(n, a[i], n);
Writeln(n);
end.