Ребус (Дома*5=Улицы) - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Расшифровать ребус, полученный в результате замены одинаковых букв одинаковыми цифрами. Найти также такие значения цифр, при которых сумма цифр в результате окажется наибольшей. ДОМА+ДОМА+ДОМА+ДОМА+ДОМА=УЛИЦЫ. Пример (блок*4=стена)
const d=10;
var b,l,o,k,s,t,e,n,a,p1,p2,p3,p4,p5,pr,blok:integer;
stena:longint;
begin
for k:=1 to 9 do
if (k<>5)and(k<>0)
then
begin
pr:=k*7 div d;
a:=k*7 mod d;
for o:=0 to 9 do
if (o<>a)and(o<>k) then
begin
p1:=o*7+pr;
p2:=p1 div d;
n:=p1 mod d;
if (n<>o)and(n<>a)and(n<>k) then
for l:=0 to 9 do
if (l<>n)and(l<>o)and(l<>k)and(l<>a) then
begin
p3:=l*7+p2;
p4:=p3 div d;
e:=p3 mod d;
if (e<>l)and(e<>o)and(e<>n)and(e<>k)and(e<>a) then
for b:=1 to 9 do
if (b<>e)and(b<>l)and(b<>o)and(b<>n)and(b<>k)and(b<>a) then
begin
p5:=b*7+p4;
s:=p5 div d;
t:=p5 mod d;
if (t<>b)and(t<>l)and(t<>e)and(t<>o)and(t<>k)and(t<>a)and(t<>n)and(s<>t)and(s<>e)and(s<>n)and(s<>a)and(s<>b)and(s<>l)and(s<>o)and(s<>k)and(s<7) then
begin
blok:=b*1000+l*100+o*d+k;
stena:=s*10000+t*1000+e*100+n*d+a;
writeln(blok,'*7=',stena);
end;
end;
end;
end;
end;
readln;
end.

Решение задачи: «Ребус (Дома*5=Улицы)»

textual
Листинг программы
var d, o, m, a, i, j: byte;
    ul, max, t, x, s: integer;
    p: set of byte;
    arr: array [1..60] of integer;
begin
  max := 0;
  i := 0;
  j := 1;
  for d := 2 to 9 do
    for o := 0 to 9 do
      begin
        if d = o then continue;
        for m := 0 to 9 do
          begin
            if (d = m) or (o = m) then continue;
            for a := 0 to 9 do
              begin
                if (d = a) or (o = a) or (m = a) then continue;
                x := 1000 * d + 100 * o + 10 * m + a;
                ul := 5 * x;
                s := 0;
                p := [];
                while ul > 0 do
                  begin
                    t := ul mod 10;
                    if (t in p) or (d = t) or (o = t) or (m = t) or (a = t) then break;
                    s := s + t;
                    p := p + [t];
                    ul := ul div 10
                  end;
                if ul > 0 then continue;
                write(x, '*5=', 5 * x, ' ');
                inc(i);
                if i > 5
                  then begin
                    i := 0;
                    writeln
                  end;
                if s = max
                  then begin
                    inc(j);
                    arr[j] := x;
                  end
                  else if s > max
                    then begin
                      j := 1;
                      arr[1] := x;
                      max := s
                    end
              end
          end
      end;
  writeln;
  writeln('The maximum sum of digits of result = ', max, ' in the following sets:');
  for i := 1 to j do writeln(arr[i], '*5=', arr[i] * 5);
  readln
end.

Объяснение кода листинга программы

  1. Переменные d, o, m, a, i, j, ul, max, t, x, s, p, arr - это переменные для выполнения задачи.
  2. Переменная max инициализируется значением 0.
  3. Переменная i инициализируется значением 0.
  4. Переменная j инициализируется значением 1.
  5. Два вложенных цикла for выполняются для перебора всех возможных комбинаций чисел от 2 до 9 для переменной d.
  6. Внутри первого вложенного цикла for перебираются все возможные значения переменной o от 0 до 9.
  7. Внутри второго вложенного цикла for перебираются все возможные значения переменной a от 0 до 9.
  8. Значение переменной x вычисляется как 1000 d + 100 o + 10 * m + a.
  9. Значение переменной ul вычисляется как 5 * x.
  10. Значение переменной s инициализируется значением 0.
  11. Значение переменной p инициализируется как пустое множество.
  12. Цикл while выполняется до тех пор, пока значение переменной ul больше 0.
  13. Внутри цикла while проверяется, является ли текущее значение переменной t (остаток от деления ul на 10) уже присутствующим в множестве p или равным одному из чисел d, o, m, a. Если это так, то цикл прерывается.
  14. Значение переменной s увеличивается на значение переменной t, а затем значение переменной t добавляется в множество p.
  15. Значение переменной ul уменьшается на 10 (делитель на 10).
  16. Если значение переменной ul все еще больше 0, то цикл продолжается.
  17. Если значение переменной ul становится равным 0, то текущий результат (x) не подходит, и цикл продолжается.
  18. Если значение переменной ul становится равным 0, и значение переменной s равно максимальному значению max, то текущий результат (x) подходит, и его значение добавляется в массив arr.
  19. Если значение переменной ul становится равным 0, и значение переменной s больше максимального значения max, то текущий результат (x) подходит, и его значение добавляется в начало массива arr.
  20. Значение переменной max обновляется новым максимальным значением s.
  21. Значение переменной j обновляется на 1, чтобы перейти к следующей итерации цикла for для перебора следующего значения переменной d.
  22. Значение переменной i обновляется на 0, чтобы перейти к следующей итерации цикла for для перебора следующего значения переменной d.
  23. Значение переменной ul обновляется на 5 * новое значение переменной d.
  24. В конце программы выводится максимальное значение max и все возможные комбинации чисел, которые его достигают.
  25. Программа завершается после чтения значения из стандартного ввода.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5