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.