Написать в pascal abc дано n чисел. найти самое большое число, на которое делятся все n чисел. входные данные в первой строке дано число n. во второй строке даны через пробел n чисел (1 < = n < = 1000). выходные данные выведите искомое число
Var a: array of integer; i, n, x, digit: integer; b1, b2: boolean; begin readln(n); setlength(a, n); for i := 0 to n - 1 do readln(a[i]); b1 := true; x := 1; digit := x; while b1 do begin if b2 then digit := x; inc(x); b2 := true; for i := 0 to n - 1 do begin if (abs(a[i]) < x) and (a[i] <> 0) then begin b1 := false;break; end else if a[i] mod x <> 0 then begin b2 := false;break; end end; end; write(digit); end.
Из условия Фано следует, что в префиксном неравномерном двоичном коде, предусматривающем однозначное декодирование, ни одно кодовое слово не может быть началом другого.
Таким образом, оставшиеся три кода не могут быть началом кода буквы Б, и началами кодов друг друга.
То есть коды 0 и 00 отпадают сразу, т.к. это начала буквы Б.
Если предположить, что один из кодов равен 1, и что нам нужны кратчайшие коды, значит оставшиеся коды могут быть только 01 и 011.
Если предположить, что коды двузначны, тогда кодами могут быть 01, 10 и 11.
В первом случае суммарная длина кодов равна 1+2+3+3 = 9, во втором случае - 2+2+2+3 = 9.
Оба варианта подходят, кратчайшая суммарная длина - 9
Из условия Фано следует, что в префиксном неравномерном двоичном коде, предусматривающем однозначное декодирование, ни одно кодовое слово не может быть началом другого.
Таким образом, оставшиеся три кода не могут быть началом кода буквы Б, и началами кодов друг друга.
То есть коды 0 и 00 отпадают сразу, т.к. это начала буквы Б.
Если предположить, что один из кодов равен 1, и что нам нужны кратчайшие коды, значит оставшиеся коды могут быть только 01 и 011.
Если предположить, что коды двузначны, тогда кодами могут быть 01, 10 и 11.
В первом случае суммарная длина кодов равна 1+2+3+3 = 9, во втором случае - 2+2+2+3 = 9.
Оба варианта подходят, кратчайшая суммарная длина - 9
i, n, x, digit: integer;
b1, b2: boolean;
begin
readln(n);
setlength(a, n);
for i := 0 to n - 1 do readln(a[i]);
b1 := true;
x := 1;
digit := x;
while b1 do begin
if b2 then digit := x;
inc(x);
b2 := true;
for i := 0 to n - 1 do begin
if (abs(a[i]) < x) and (a[i] <> 0) then begin b1 := false;break; end
else if a[i] mod x <> 0 then begin b2 := false;break; end
end;
end;
write(digit);
end.