MDIGITS - Counting Digits

Tác giả: flashmt

Ngôn ngữ: Pascal

var a,b,i:longint;
    d,c:array[0..9] of longint;
    z:array[1..8] of longint;

procedure calc(m,n,k:longint);
var p,q,t,u,j,l:longint; s:string;
begin
     if m=n then
     begin
          str(n,s);
          for j:=1 to length(s) do
              inc(d[ord(s[j])-48]);
          exit;
     end;
     if k=0 then
     begin
          for j:=m to n do
          begin
               str(j,s);
               for t:=1 to length(s) do
                   inc(d[ord(s[t])-48]);
          end;
          exit;
     end;
     if m mod c[k] = 0 then p:=m
     else p:=m+c[k]-m mod c[k];
     inc(n);
     q:=n-n mod c[k];
     dec(n);
     if p>=q then calc(m,n,k-1)
     else
     begin
          t:=p div c[k];
          u:=q div c[k];
          for j:=0 to 9 do
              d[j]:=d[j]+c[k-1]*k*(u-t);
          for j:=t to u-1 do
          begin
               str(j,s);
               for l:=1 to length(s) do
                   inc(d[ord(s[l])-48],c[k]);
          end;
          if m<p then calc(m,p-1,k-1);
          if q<n+1 then calc(q,n,k-1);
     end;
end;

begin
     c[0]:=1;
     fillchar(d,sizeof(d),0);
     for i:=1 to 8 do c[i]:=c[i-1]*10;
     z[1]:=9;
     for i:=2 to 8 do z[i]:=z[i-1]*10;
     repeat
           readln(a,b);
           if (a+b=0) then break;
           if a>b then
           begin
                a:=a+b;
                b:=a-b;
                a:=a-b;
           end;
           fillchar(d,sizeof(d),0);
           calc(a,b,7);
           for i:=0 to 9 do write(d[i],' ');
           writeln;
     until false;
end.

Download