Конспект лекций по программированию для начинающих. Гладков В.П. - 126 стр.

UptoLike

Составители: 

128
до 9, в третьем - десятки от 0 до 9, в четвертом цикле - единицы от 0 до 9.
Исходным значением искомого отношения может быть ноль.
{ фрагмент 52 }
y:=0; { начальное значение отношения }
a:=0; { искомое число }
for i:=1 to 9 do
for j:=0 to 9 do
for k:=0 to 9 do
for l:=0 to 9 do
begin s:=i+j+k+l;
x:=((10*i+j)*10+k)*10+l;
if y<s/x then begin y:=s/x; a:=x end
end.
Пример 10.52. Найти все натуральные трехзначные числа, каждое из которых
обладает двумя следующими свойствами:
- первая цифра в три раза меньше последней его цифры;
- сумма самого числа с числом, получающимся из него перестановкой второй и
третьей его цифр, делится на 8 без остатка.
Решение. Простое решение можно получить по аналогии с предыдущим:
{ фрагмент 53 }
for i:=1 to 9 do { цифра сотен }
for j:=0 to 9 do { цифра десятков }
for k:=0 to 9 do { цифра единиц }
if (i=3*k) and ((100*i+10*j+k+100*i+10*k+j) mod 8=0)
then write(i,j,k,' ').
Посмотрим, каким образом можно уменьшить перебор. Если цифра сотен в три
раза меньше цифры единиц, то k=3*i. Поскольку k - цифра, то k=3*i<=9 или i<=3.
Рассмотрим второе условие, приведем в нем подобные члены:
(100*i+10*j+3*i+100*i+10*3*i+j) mod 8=0 => (200*i+33*i+11*j) mod 8=0.
Поскольку 200*i делится
на 8, то его можно отбросить. Таким образом, нужно
проверять условие (33*i+11*j) mod 8=0 или 11*(3*i+j) mod 8=0. Получаем
следующий фрагмент программы:
{ фрагмент 54 }
for i:=1 to 3 do
for j:=0 to 9 do
if (3*i+j) mod 8=0
then write(i,j,3*i).
Пример 10.53. Найти все пятизначные числа вида 5m27n (m и n - цифры!),
которые делятся на 15.
Решение. Легко построить полный перебор всех возможных случаев.
{ фрагмент 55 }
for n:=0 to 9 do
for m:=0 to 9 do
if (50000+n*1000+270+m) mod 15=0
then write(5,n*1000+270+m,' ').
                                      128

до 9, в третьем - десятки от 0 до 9, в четвертом цикле - единицы от 0 до 9.
Исходным значением искомого отношения может быть ноль.
   { фрагмент 52 }
   y:=0; { начальное значение отношения }
   a:=0; { искомое число }
   for i:=1 to 9 do
       for j:=0 to 9 do
              for k:=0 to 9 do
                      for l:=0 to 9 do
                      begin s:=i+j+k+l;
                             x:=((10*i+j)*10+k)*10+l;
                             if y (200*i+33*i+11*j) mod 8=0.
Поскольку 200*i делится на 8, то его можно отбросить. Таким образом, нужно
проверять условие (33*i+11*j) mod 8=0 или 11*(3*i+j) mod 8=0. Получаем
следующий фрагмент программы:
   { фрагмент 54 }
   for i:=1 to 3 do
       for j:=0 to 9 do
              if (3*i+j) mod 8=0
              then write(i,j,3*i).
   Пример 10.53. Найти все пятизначные числа вида 5m27n (m и n - цифры!),
которые делятся на 15.
   Решение. Легко построить полный перебор всех возможных случаев.
   { фрагмент 55 }
   for n:=0 to 9 do
       for m:=0 to 9 do
              if (50000+n*1000+270+m) mod 15=0
              then write(5,n*1000+270+m,' ').