Определить количество натуральных чисел, таких, что сумма любых трех подряд идущих цифр числа делится на 3 - PascalABC.NET
Формулировка задачи:
Определить, сколько существует натуральных k-значных (3<=k<=30) чисел, таких что сумма любых трех подряд идущих цифр числа делится на 3 без остатка.
Например:
Ввод: 3
Вывод: 300
Решение задачи: «Определить количество натуральных чисел, таких, что сумма любых трех подряд идущих цифр числа делится на 3»
textual
Листинг программы
type m=array[1..32] of integer;
var
n1,n2,d:m;
k,i,j:integer;
ok:boolean;
procedure initmas(k:integer;var a:m);
var
i:integer;
begin
for i:=1 to 32 do a[i]:=0;
if k<>0 then a[k]:=1;
end;
procedure sum(a,b:m;var c:m);
var
i:integer;
begin
for i:=1 to 31 do begin
c[i]:=a[i]+b[i];
if c[i]>9 then begin
a[i+1]:=a[i+1]+c[i] div 10;
c[i]:=c[i] mod 10;
end;
end;
end;
function check(a:m;k:integer):boolean;
var
i:integer;
begin
i:=32;
while a[i]=0 do if i>1 then dec(i);
if i>k then check:=true else check:=false;
end;
procedure printm(a:m);
var
i:integer;
begin
i:=32;
while a[i]=0 do if i>1 then dec(i);
for i:=i downto 1 do write(a[i]);
writeln;
end;
begin
write('k=');readln(k);
initmas(k,n1);
initmas(1,n2);
initmas(0,d);
repeat
i:=1;
repeat
j:=0;ok:=false;
j:=j+n1[i]+n1[i+1]+n1[i+2];
if (j>0) and (j mod 3=0) then begin sum(d,n2,d);ok:=true;end;
i:=i+1;
until (i>k-2) or (ok);
sum(n1,n2,n1);
until check(n1,k);
printm(d);
readln;
end.