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

UptoLike

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

129
Попытаемся уменьшить перебор. Заметим, что число делится на 15, если оно
делится на 5 и 3 (15=5·3). Число делится на 5, если оно оканчивается на 0 или 5.
Следовательно, значениями m могут быть только цифры 0 или 5. Число делится на
3, если сумма его цифр делится на 3. Три цифры числа известны, их сумма равна
5+2+7=14. Если m=0, то сумма равна 14
и нужно подобрать такое n, чтобы сумма
была кратна 3. Отсюда значение n изменяется от 1 до 9 (это цифра!) с шагом 3.
Если m=5, то сумма четырех цифр равна 19, следовательно, n изменяется от 2 до 9
с шагом 3. После этих рассуждений перебор свелся к перебору непосредственно
решений задачи.
{ фрагмент 56 }
n:=1;
while n<=9 do
begin write(5,n,270,' ');
n:=n+3
end;
writeln;
n:=2;
while n<=9 do
begin write(5,n,275,' ');
n:=n+3
end.
Пример 10.54. Последовательность перестановок на множестве {1, 2, ..., n}
представлена в лексикографическом порядке, если она записана в порядке
возрастания получающихся чисел. Например, лексикографическая
последовательность перестановок трех элементов имеет вид 123, 132, 213, 231, 312,
321. Сформировать все k-элементные перестановки множества {1, 2, 3, ..., n} в
лексикографическом порядке.
Решение. Для хранения перестановок будем использовать массив (см.
следующую главу).
{ фрагмент 57 }
const nn=100;
type mas=array[1..nn] of integer;
var a:mas;
i,j,k,n,p:integer;
begin
write('Введите n и k ');readln(n,k);
for i:=1 to k do a[i]:=i;
p:=k;
while p>=1 do
begin
for j:=1 to k do write(a[j],' ');writeln;
if a[k]=n then p:=p-1 else p:=k;
if p>=1
then for i:=k downto p do a[i]:=a[p]+i-p+1;
end
end.
                                        129

    Попытаемся уменьшить перебор. Заметим, что число делится на 15, если оно
делится на 5 и 3 (15=5·3). Число делится на 5, если оно оканчивается на 0 или 5.
Следовательно, значениями m могут быть только цифры 0 или 5. Число делится на
3, если сумма его цифр делится на 3. Три цифры числа известны, их сумма равна
5+2+7=14. Если m=0, то сумма равна 14 и нужно подобрать такое n, чтобы сумма
была кратна 3. Отсюда значение n изменяется от 1 до 9 (это цифра!) с шагом 3.
Если m=5, то сумма четырех цифр равна 19, следовательно, n изменяется от 2 до 9
с шагом 3. После этих рассуждений перебор свелся к перебору непосредственно
решений задачи.
    { фрагмент 56 }
    n:=1;
    while n<=9 do
    begin     write(5,n,270,' ');
              n:=n+3
    end;
    writeln;
    n:=2;
    while n<=9 do
    begin     write(5,n,275,' ');
              n:=n+3
    end.
    Пример 10.54. Последовательность перестановок на множестве {1, 2, ..., n}
представлена в лексикографическом порядке, если она записана в порядке
возрастания         получающихся          чисел.        Например, лексикографическая
последовательность перестановок трех элементов имеет вид 123, 132, 213, 231, 312,
321. Сформировать все k-элементные перестановки множества {1, 2, 3, ..., n} в
лексикографическом порядке.
    Решение. Для хранения перестановок будем использовать массив (см.
следующую главу).
    { фрагмент 57 }
    const nn=100;
    type mas=array[1..nn] of integer;
    var       a:mas;
              i,j,k,n,p:integer;
    begin
       write('Введите n и k ');readln(n,k);
       for i:=1 to k do a[i]:=i;
       p:=k;
       while p>=1 do
       begin
              for j:=1 to k do write(a[j],' ');writeln;
              if a[k]=n then p:=p-1 else p:=k;
              if p>=1
              then for i:=k downto p do a[i]:=a[p]+i-p+1;
       end
    end.