давно
Старший Модератор
31795
6196
27.02.2008, 23:16
общий
это ответ
Здравствуйте, Кончаков Роман Юрьевич!
В приложении программа с полным перебором всех вариантов.
Работает очень долго, если нужно с перестановкой могу выложить.
Удачи!
Приложение:
program q124403;
var
a,b,c,d:string;
e:array[0..10]of integer;
f:boolean;
i,j,p,n,m:integer;
{процедура для вывода значений}
procedure outData(s:string);
begin
for i:=length(c) downto 1 do
if i<=length(s)then write(e[pos(s[i],d)])
else write(‘ ‘);
writeln;
end;
{функция для ввода задания}
function inpData(z:char):string;
var
s,o:string;
begin
{вводим строку}
write(‘Enter ‘,z,‘:‘);
readln(s);
{переворачиваем строку, после этого со всеми числами можно можно работать одинаково}
o:=‘‘;
for i:=1 to length(s)do
o:=s[i]+o;
inpData:=o;
end;
begin{вводим строки}
a:=inpData(‘A‘);
b:=inpData(‘B‘);
c:=inpData(‘C‘);
d:=‘‘;{в этой строке будет хранится все буквы задания}
for i:=1 to length(c)do
begin
if (pos(a[i],d)=0)and(i<=length(a)) then d:=d+a[i];
if (pos(b[i],d)=0)and(i<=length(b)) then d:=d+b[i];
if pos(c[i],d)=0 then d:=d+c[i];
end;
{т.к. цифр только 10(0:9) проверяем правильность ввода задания}
if (length(d)>0)and(length(d)<11)then
begin
{счетчик кол-ва вариантов}
n:=0;
for i:=0 to 10 do e[i]:=i mod 10;
{начинаем перебор}
repeat
{проверяем есть ли совпадающие цифры, если есть,
сбрасываем флаг и ничего не делаем}
f:=true;
for i:=1 to length(d)-1 do
for j:=i+1 to length(d) do
if e[i]=e[j] then f:=false;
{если все цифры разные начинаем работу}
if f then
begin
{перенос с предыдущего разряда}
p:=0;
for i:=1 to length(c)do
begin
{суммируем с учетом переноса с предыдущего разряда}
p:=p+e[pos(a[i],d)]+e[pos(b[i],d)];
{если числа не равны сбрасываем флаг}
if (p mod 10) <> e[pos(c[i],d)] then f:=false;
{определяем перенос на следующий разряд}
p:=p div 10;
end;
end;
{если флаг ещё не сброшен решение найдено, выводим результат и увеличивем счетчик}
if f then
begin
outData(a);
outData(b);
outData(c);
writeln;
inc(n);
end;
{хитрый цикл перебора всех значений}
j:=1;
repeat
inc(e[j]);
p:=e[j]div 10;
e[j]:=e[j] mod 10;
j:=j+p;
until (p=0)or(j>length(d));
until j>length(d);
end
else
writeln(‘error:неверное кол-во букв‘);
writeln(‘вариантов:‘,n);
readln;
end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.