Другие языки программирования и технологии

turbo pascal,помогите пожалуйста.

Дано трехзначное число. Определить кол-во всех различных трехзначных чисел, которые можно составить из цифр этого числа.
Не понятно из условия, могут ли цифры введённого числа входить повторно в формируемые числа.
Например введено число 123.
Из него можно получить только числа 123, 132, 213, 231, 312 и 321?
Или числа 111, 112, 113, 121 и т. д. тоже составляются?
В первом случае действительно 3!, но только если все цифры введённого числа различны и среди них нет нуля.
Во втором - кол-во чисел вычисляется по формуле N=K^3 (размещение с повторениями), где
K - кол-во неповторяющихся цифр.
А если во введённом числе есть цифра ноль, то из полученной величины нужно отнять кол-во двухзначных чисел, составленных из этих же цифр: N=K^3-K^2.
На эту же тему см. похожую программу.

Программа, реализующая второй случай:

program N75626670;
var
Digits: array [0 .. 2] of byte;
DigSet: set of 0 .. 9;
x, y, p: word;
i, j, n, k: byte;
begin
{$I-}
repeat
write('Введите натуральное 3-х значное число: ');
readln(x);
until (IOResult = 0) and (x > 99) and (x < 1000);
{$I+}
DigSet := [ ];
for i := 1 to 3 do
begin
include(DigSet, x mod 10); {или DigSet := DigSet + [x mod 10];}
x := x div 10
end;
k := 0;
for i := 0 to 9 do
if i in DigSet then
begin
Digits[k] := i;
inc(k) {или k := k + 1}
end;
n := k * sqr(k); {или n := k * k * k;}
writeln('Составленные числа: ');
for i := 0 to k * sqr(k) - 1 do
begin
x := 0;
p := 1;
y := i;
for j := 1 to 3 do
begin
x := p * Digits[y mod k] + x;
p := p * 10;
y := y div k
end;
if x < 100 then
dec(n) {или n := n - 1}
else
write(x:5)
end;
writeln(#13#10'Всего чисел: ', n);
readln
end.

В программе для исключения повторяющихся цифр используется множество. Заодно автоматически получается их сортировка. Для контроля все составленные числа выводятся на экран.

Программа, просто считающая кол-во чисел, без вывода на экран и без проверки корректности ввода:
program N75626670;
var
DigSet: set of 0 .. 9;
x: word;
i, n, k: byte;
begin
write('Введите натуральное 3-х значное число: ');
readln(x);
DigSet := [ ];
for i := 1 to 3 do
begin
DigSet := DigSet + [x mod 10];
x := x div 10
end;
k := 0;
for i := 0 to 9 do
if i in DigSet then
inc(k);
n := k * sqr(k);
if 0 in DigSet then
n := n - sqr(k); {или dec(n, k * k);}
writeln('Всего чисел: ', n);
readln
end.

Эта же задача, но реализована не в Turbo, a в Free Паскале без использования множества.
Подобная задача, но цифры введённого числа включаются только по одному разу. Реализована с помощью рекурсии и вспомогательного массива флажков.
Серик Раисов
Серик Раисов
51 590
Лучший ответ
по-моему это будет три факториал...
Юрий Губарев
Юрий Губарев
34 293