Подсчитать количество N-значных чисел - Pascal
Формулировка задачи:
Составить алгоритм, подсчитывающий количество всех N-значных
чисел, сумма цифр которых равна данному числу N.
Решение задачи: «Подсчитать количество N-значных чисел»
textual
Листинг программы
const
maxValue = 25;
var
tbl : array[0 .. maxValue, 0 .. maxValue] of qword;
function CR(n : integer; s : integer) : qword;
var
R : qword;
i : integer;
begin
if n = 0 then exit(Ord(s = 0));
R := 0;
if(tbl[n, s] <> qword(-1)) then exit(tbl[n, s]);
for i := 0 to 9 do
if s - i >= 0 then Inc(R, CR(Pred(n), s - i));
tbl[n, s] := R;
result := R;
end;
function FC(n : integer; s : integer) : qword;
var
R : qword;
i : integer;
begin
fillqword(tbl, sizeof(tbl) div sizeof(qword), qword(-1));
R := 0;
for i := 1 to 9 do
if s - i >= 0 then Inc(R, CR(Pred(n), s - i));
result := R;
end;
var n : integer;
begin
write('n = '); readln(n);
writeln('result: ', FC(n, n));
end.
Объяснение кода листинга программы
- В первой функции
CRмы используем массивtblразмером от 0 доmaxValueв обоих направлениях для хранения результатов. Если значениеtbl[n, s]не равноqword(-1), то оно уже было учтено, иначе мы добавляем его вR. Мы также используем циклforдля увеличенияRна результат вызова функцииCRдля предыдущего значенияn, уменьшенного наi. В конце мы обновляем значениеtbl[n, s]наR. - Во второй функции
FCмы сначала заполняем массивtblзначениями-1, используя функциюfillqword. Затем мы инициализируемRзначением0. Затем мы используем тот же циклfor, что и в первой функции, но вместо вызова функцииCRмы вызываем функциюFCдля предыдущего значенияn, уменьшенного наi. В конце мы обновляем значениеtbl[n, n]наR. - В основной части программы мы считываем значение
nс помощью функцииreadln. Затем мы вызываем функциюFC(n, n)и выводим результат.