var a:STRING;
i,n,j,k,x,z,y:integer; d:boolean;
begin
readln(n);
read(a);
d:=false;
if (n=1)and (a='8') then d:=true;
if n=2 then begin
x:=ord(a[1]) - 48;
y:=ord(a[2]) - 48;
if((x*10+y) mod 8=0) or
((y*10+x) mod 8=0) then d:=true;
end
else
begin
for i:=1 to N-2 do
for j:=i+1 to N-1 do
for k:=i+2 to N do
begin
x:=ord(a[i])-48;
y:=ord(a[j])-48;
z:=ord(a[k])-48;
if((x*4+y*2+z) mod 8=0) or
((y*4+x*2+z) mod 8=0) or
((y*4+z*2+x) mod 8=0) or
((x*4+z*2+y) mod 8=0) or
((z*4+y*2+x) mod 8=0) or
((z*4+x*2+y) mod 8=0) then d:=true;
end; end;
if d then write('YES') else write('NO');
end.
Другим вариантом является представление чисел со знаком в дополнительном коде. Мысль построения дополнительного кода довольно ординарна: на оси целых положительных чисел, помещающихся в машинное слово (0 ÷ 65535), сместим положение «О» на середину интервала; числа, попадающие в первую половину (0 ÷ 32767) будем считать положительными, а числа из 2-ой половины (32768 ÷ 65535) — отрицательными. В данном случае судить о знаке числа можно будет по его величине и в очевидном виде выделение знака не будет нужно. К примеру, 1000000000000012 = 3276910 является кодом отрицательного числа, а 0000000000000012 = 110 — кодом положительного. Принадлежность к интервалу кодов положительных либо отрицательных чисел видна по состоянию старшего бита — у кодов положительных чисел его значение «0», отрицательных — «1». Это припоминает представление со знаком, но не является таким, так как употребляется другой принцип кодировки. Его применение позволяет поменять вычитание чисел их суммированием в дополнительном коде. Убедимся в этом чуток позже после того, как обсудим метод построения дополнительного кода целых чисел.