Сформируйте последовательность, состоящую не менее чем из n цифр, такую, что каждое двухзначное число, записываемое двумя соседними цифрами (в том порядке, в каком они написаны), должно делиться на 19 или 23. Последовательность должна начинаться на заданную цифру.
(Язык программирования: Pascal. Используйте цикл while или repeat.)
Ответы на вопрос
Задачу удобно представить как построение цепочки цифр. Пусть последняя записанная цифра равна d. Нужно найти такую следующую цифру x, чтобы двухзначное число
pascal10 * d + x
делилось на 19 или на 23.
Двухзначные числа, которые делятся на 19 или 23:
19, 23, 38, 46, 57, 69, 76, 92, 95
Из них получаются возможные переходы между цифрами:
1 -> 9
2 -> 3
3 -> 8
4 -> 6
5 -> 7
6 -> 9
7 -> 6
9 -> 2
9 -> 5
Например, если последняя цифра 7, следующей может быть только 6, потому что число 76 делится на 19.
Если последовательность должна начинаться с заданной цифры, то можно каждый раз подбирать следующую цифру по текущей последней цифре. Для некоторых цифр продолжение невозможно: например, если начать с 0 или 8, то нет двухзначного числа из списка, которое начиналось бы с этой цифры.
Пример решения на Pascal с циклом while:
pascalprogram SequenceDigits;
var
n, i: integer;
d, next: integer;
ok: boolean;
begin
write('Введите n: ');
readln(n);
write('Введите начальную цифру: ');
readln(d);
if (d < 0) or (d > 9) then
begin
writeln('Ошибка: начальная цифра должна быть от 0 до 9.');
halt;
end;
write(d);
i := 1;
ok := true;
while (i < n) and ok do
begin
case d of
1: next := 9;
2: next := 3;
3: next := 8;
4: next := 6;
5: next := 7;
6: next := 9;
7: next := 6;
9: next := 2;
else
ok := false;
end;
if ok then
begin
write(next);
d := next;
i := i + 1;
end;
end;
writeln;
if not ok then
writeln('Невозможно построить последовательность длиной ', n,
' с такой начальной цифрой.');
end.
Но в этом варианте есть одна проблема: если текущая цифра стала 8, продолжение остановится. Например, для начала 3 получится 38, но после 8 уже нельзя подобрать следующую цифру.
Чтобы программа могла строить длинные последовательности, лучше выбирать такие переходы, которые попадают в цикл. Хороший цикл получается такой:
9 -> 2 -> 3 -> 8
Но он обрывается на 8, поэтому не подходит.
Зато есть устойчивый цикл:
9 -> 5 -> 7 -> 6 -> 9
Он дает числа:
95, 57, 76, 69
Все они делятся на 19 или 23:
95 делится на 19
57 делится на 19
76 делится на 19
69 делится на 23
Поэтому, если мы попали в этот цикл, можно продолжать последовательность сколько угодно долго.
Улучшенная программа:
pascalprogram SequenceDigits;
var
n, i: integer;
d, next: integer;
ok: boolean;
begin
write('Введите n: ');
readln(n);
write('Введите начальную цифру: ');
readln(d);
if (d < 0) or (d > 9) then
begin
writeln('Ошибка: начальная цифра должна быть от 0 до 9.');
halt;
end;
write(d);
i := 1;
ok := true;
while (i < n) and ok do
begin
case d of
1: next := 9;
2: next := 3;
3: next := 8;
4: next := 6;
5: next := 7;
6: next := 9;
7: next := 6;
{ Для цифры 9 выбираем 5, а не 2,
чтобы попасть в бесконечный цикл 9-5-7-6 }
9: next := 5;
else
ok := false;
end;
if ok then
begin
write(next);
d := next;
i := i + 1;
end;
end;
writeln;
if not ok then
writeln('Невозможно построить последовательность длиной ', n,
' с такой начальной цифрой.');
end.
Однако даже этот вариант не всегда сможет построить последовательность нужной длины. Например, если начальная цифра 3, получится:
38
После цифры 8 продолжение невозможно.
Поэтому можно заранее разделить начальные цифры на подходящие и неподходящие.
Подходящие для длинной последовательности:
1, 4, 5, 6, 7, 9
Потому что они попадают в цикл:
9 -> 5 -> 7 -> 6 -> 9
Например:
1 -> 9 -> 5 -> 7 -> 6 -> 9 -> 5 -> ...
4 -> 6 -> 9 -> 5 -> 7 -> 6 -> ...
5 -> 7 -> 6 -> 9 -> 5 -> ...
Полное решение:
pascalprogram SequenceDigits;
var
n, i: integer;
d, next: integer;
ok: boolean;
begin
write('Введите n: ');
readln(n);
write('Введите начальную цифру: ');
readln(d);
if (d < 0) or (d > 9) then
begin
writeln('Ошибка: начальная цифра должна быть от 0 до 9.');
halt;
end;
if n <= 0 then
begin
writeln('Длина последовательности должна быть положительной.');
halt;
end;
write(d);
i := 1;
ok := true;
while (i < n) and ok do
begin
case d of
1: next := 9;
4: next := 6;
5: next := 7;
6: next := 9;
7: next := 6;
9: next := 5;
else
ok := false;
end;
if ok then
begin
write(next);
d := next;
i := i + 1;
end;
end;
writeln;
if not ok then
writeln('Невозможно построить последовательность длиной ', n,
' с заданной начальной цифрой.');
end.
Пример работы программы:
Введите n: 12
Введите начальную цифру: 1
195769576957
Проверим соседние двухзначные числа:
19, 95, 57, 76, 69, 95, 57, 76, 69, 95, 57
Каждое из них делится на 19 или на 23.
Можно также написать вариант с циклом repeat:
pascalprogram SequenceDigitsRepeat;
var
n, i: integer;
d, next: integer;
ok: boolean;
begin
write('Введите n: ');
readln(n);
write('Введите начальную цифру: ');
readln(d);
if (d < 0) or (d > 9) then
begin
writeln('Ошибка: начальная цифра должна быть от 0 до 9.');
halt;
end;
if n <= 0 then
begin
writeln('Длина последовательности должна быть положительной.');
halt;
end;
write(d);
i := 1;
ok := true;
if n > 1 then
begin
repeat
case d of
1: next := 9;
4: next := 6;
5: next := 7;
6: next := 9;
7: next := 6;
9: next := 5;
else
ok := false;
end;
if ok then
begin
write(next);
d := next;
i := i + 1;
end;
until (i = n) or (not ok);
end;
writeln;
if not ok then
writeln('Невозможно построить последовательность длиной ', n,
' с заданной начальной цифрой.');
end.
Основная идея решения: строить последовательность по одной цифре, каждый раз выбирая следующую цифру так, чтобы число из двух соседних цифр делилось на 19 или 23. Для бесконечного продолжения используется цикл цифр:
9 -> 5 -> 7 -> 6 -> 9
Поэтому программа может сформировать последовательность любой требуемой длины, если начальная цифра позволяет попасть в этот цикл.
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili

