Консультация № 124403
22.02.2008, 17:37
0.00 руб.
0 1 1
Уважаемые иксперты требуется решить такую задачу:
DONALD
+
GERALD
--------
ROBERT

заменить буквы на цифры в совпадении по буквам (программа должна решать любую задачу данного вида, если, конечно, она имеет решение).

Обсуждение

давно
Старший Модератор
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.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа