2001 - VỀ CÁC SỐ ĐẶC BIỆT CÓ 10 CHỮ SỐ(DÀNH CHO HỌC SINH THCS V...

Bài 88/2001 - Về các số đặc biệt có 10 chữ số

(Dành cho học sinh THCS và THPT)

Thuật toán: mảng a[0..9] lưu kết quả, t[i] là số các chữ số i trong a. Theo bài ta có thể suy ra: a[0] + a[1] + ...

+ a[9] = số các chữ số 0 + số các chữ số 1 + ... + số các chữ số 9 = 10. Như vậy, ta dùng phép sinh đệ quy có

nhánh cận để giải bài toán: ở mỗi bước sinh a[i], ta tính tổng các chữ số a[0]..a[i] (lưu vào biến s), nếu s >10

thì không sinh tiếp nữa. Sau đây là toàn bộ chương trình:

Procedure bai88;

const fo='bai88.out';

var a,t:array[0..9] of integer;

i,s:integer;

f:text;

procedure save;

var i:integer;

begin

for i:=0 to 9 do if a[i] <> t[i] then exit;

for i:=0 to 9 do write(f,a[i]); writeln(f);

end;

procedure try(i:integer);

var j:integer;

for j:= 0 to 9 do

if ((i<j) or ((i>=j) and (t[j] +1 <=a[j]))) and (s<=10) then

begin

a[i]:=j;

inc(t[j]);

s:=s+j;

if i<9 then try(i+1) else save;

dec(t[j]);

s:=s-j;

end;

BEGIN

assign(f,fo);rewrite(f);

for i:=1 to 9 do

fillchar(t,sizeof(t),0);

s:=0;

a[0]:=i;

s:=s+i;

t[i]:=1;

try(1);

close(f);

END.

(Lời giải của bạn Nguyễn Chí Thức - Lớp 11A1 khối PTCTT - ĐHSP Hà Nội)