Ребус (Дома*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.
Объяснение кода листинга программы
- Переменные d, o, m, a, i, j, ul, max, t, x, s, p, arr - это переменные для выполнения задачи.
- Переменная
max
инициализируется значением 0. - Переменная
i
инициализируется значением 0. - Переменная
j
инициализируется значением 1. - Два вложенных цикла
for
выполняются для перебора всех возможных комбинаций чисел от 2 до 9 для переменнойd
. - Внутри первого вложенного цикла
for
перебираются все возможные значения переменнойo
от 0 до 9. - Внутри второго вложенного цикла
for
перебираются все возможные значения переменнойa
от 0 до 9. - Значение переменной
x
вычисляется как 1000 d + 100 o + 10 * m + a. - Значение переменной
ul
вычисляется как 5 * x. - Значение переменной
s
инициализируется значением 0. - Значение переменной
p
инициализируется как пустое множество. - Цикл
while
выполняется до тех пор, пока значение переменнойul
больше 0. - Внутри цикла
while
проверяется, является ли текущее значение переменнойt
(остаток от деленияul
на 10) уже присутствующим в множествеp
или равным одному из чисел d, o, m, a. Если это так, то цикл прерывается. - Значение переменной
s
увеличивается на значение переменнойt
, а затем значение переменнойt
добавляется в множествоp
. - Значение переменной
ul
уменьшается на 10 (делитель на 10). - Если значение переменной
ul
все еще больше 0, то цикл продолжается. - Если значение переменной
ul
становится равным 0, то текущий результат (x) не подходит, и цикл продолжается. - Если значение переменной
ul
становится равным 0, и значение переменнойs
равно максимальному значениюmax
, то текущий результат (x) подходит, и его значение добавляется в массивarr
. - Если значение переменной
ul
становится равным 0, и значение переменнойs
больше максимального значенияmax
, то текущий результат (x) подходит, и его значение добавляется в начало массиваarr
. - Значение переменной
max
обновляется новым максимальным значениемs
. - Значение переменной
j
обновляется на 1, чтобы перейти к следующей итерации циклаfor
для перебора следующего значения переменнойd
. - Значение переменной
i
обновляется на 0, чтобы перейти к следующей итерации циклаfor
для перебора следующего значения переменнойd
. - Значение переменной
ul
обновляется на 5 * новое значение переменнойd
. - В конце программы выводится максимальное значение
max
и все возможные комбинации чисел, которые его достигают. - Программа завершается после чтения значения из стандартного ввода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д