Ребус (Дома*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
и все возможные комбинации чисел, которые его достигают. - Программа завершается после чтения значения из стандартного ввода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д