Cho hai số nguyên dương 𝑚 và 𝑛. Hãy lập trình đếm số các chữ số 0, 1, 2, …, 9 của tất cả các số nằm giữa hai số 𝑚 và 𝑛, kể cả hai số 𝑚 và 𝑛. Dữ liệu vào: Tệp văn bản NDIGIT.INP gồm một dòng ghi hai số 𝑚 và 𝑛 cách nhau một dấu cách có giá trị không vuột quá 10^6. Kết quả: Ghi ra tệp văn bản NDIGIT.OUT 10 số nguyên trên một dòng theo thứ tự là số lượng các số từ 0 đến 9. Ví dụ: 𝑚=10, 𝑛=12 thì các số cần đếm chữ số là: 10, 11, 12 gồm có: 1 chữ số 0; 4 chữ số 1 và 1 chữ số 2. DN.INP DN.OUT 10 12 1 4 1 0 0 0 0 0 0 0

2 câu trả lời

Uses crt;
Var 
    m,n,i,a,k: LongInt;
    so:array[0..9] of integer;
Begin
    clrscr;
    repeat
    writeln('Nhap so nguyen duong m va n: '); readln(m,n);
    until(m<=1000000)and(n<=1000000);       {Nhập mn trong khoảng 10^6 nếu không lặp lai}
    for i:=0 to 9 do so[i]:=0;                               {Gán giá trị phần tử của mảng để đếm chữ số}
    if m>n then begin i:=m;m:=n;n:=i; end;    {Nếu số trước lớn hơn số sau thì hoán đổi giá trị}
    for i:=m to n do                                         {Xét các số từ m đến n}
        begin
        a:=i;                            {Sử dụng a thay thế vì trong vòng lặp i không được thay đổi giá trị}
        while (a<>0) do
            begin
            k:=a mod 10;                  {Tìm chữ số bằng cách chia lấy phần dư}
            so[k]:=so[k]+1;              {Cộng thêm vào nhóm của số tìm được}
            a:=a div 10;                    {Bỏ chữ số vừa tìm được khỏi a}
            end;
        end;
    for i:=0 to 9 do write(so[i],' ');          {In ra mảng chữ số đã được đếm}
    readln;
End.

var a:array[0..trunc(1e6+7)] of longint;
    i,l,r,j:longint;
    s,st:ansistring;
    ch:char;
begin
assign(input,'NDIGIT.inp');reset(input);
assign(output,'NDIGIT.out');rewrite(output);
readln(l,r);
fillchar(a,sizeof(a),0);
if r-l=0 then
  begin
    str(l,s);
    st := st+s+s;
    for i := 1 to length(st) do inc(a[ord(st[i])]);
    for ch := '0' to '9' do write(a[ord(ch)],#32);
  end
else
 begin
  for i := l to r do
   begin
    str(i,s);
    st := st + s;
    for j := 1 to length(st) do inc(a[ord(st[j])]);
    st := '';
   end;
  for ch := '0' to '9' do
  write(a[ord(ch)],#32);
end;
close(input);close(output);
end.