Найти количество "правильных" чисел - Pascal
Формулировка задачи:
Приветствую и прошу о помощи. Вводится переменная x, которая обозначает длину натурального ряда чисел (если ввести 10, то подразумевается,что мы взяли 1,2,3,4,5,6,7,8,9,10), максимальное значение x=100000. Узнать, сколько в натуральном ряду с длиной x "правильных" чисел, правильным числом считаем то, у которого четные и нечетные цифры чередуются.
Решение задачи: «Найти количество "правильных" чисел»
textual
Листинг программы
var x, n, p, mask_h, mask_l, hi, lo: longint; label qt; begin readln(x); n := 0; p := 0; hi := 9; mask_h := 1; while x > hi do begin hi := hi * 10 + 9; mask_h := mask_h * 10 + p mod 2; inc(p) end; if p > 0 then begin dec(p); mask_l := mask_h div 10; for hi := 1 to 9 do for lo := 0 to 9 do if hi <> lo then if mask_h * hi + mask_l * lo <= x then inc(n) else goto qt end; qt: n := n + p * 81; writeln(n); readln end.
Объяснение кода листинга программы
- Объявление переменных:
x
,n
,p
,mask_h
,mask_l
,hi
,lo
- переменные типа longint (целочисленный тип данных), которые будут хранить значения.
- Ввод значения переменной:
readln(x)
- пользователь вводит значениеx
.
- Инициализация переменных:
n := 0
- переменнойn
присваивается значение 0.p := 0
- переменнойp
присваивается значение 0.hi := 9
- переменнойhi
присваивается значение 9.mask_h := 1
- переменнойmask_h
присваивается значение 1.
- Цикл для определения верхней границы чисел:
while x > hi do
- покаx
большеhi
выполняется следующий блок команд.hi := hi * 10 + 9
- переменнойhi
присваивается новое значение, умноженное на 10 и увеличенное на 9.mask_h := mask_h * 10 + p mod 2
- переменнойmask_h
присваивается новое значение, умноженное на 10 и увеличенное на остаток от деленияp
на 2.inc(p)
- увеличивает значение переменнойp
на 1.
- Условие и вложенный цикл:
if p > 0 then
- еслиp
больше 0, выполняется следующий блок команд.dec(p)
- уменьшает значениеp
на 1.mask_l := mask_h div 10
- переменнойmask_l
присваивается значениеmask_h
деленное на 10.- Цикл
for hi := 1 to 9 do
- переменнаяhi
перебирает значения от 1 до 9, включительно. - Вложенный цикл
for lo := 0 to 9 do
- переменнаяlo
перебирает значения от 0 до 9, включительно.if hi <> lo then
- еслиhi
не равноlo
, выполняется следующий блок команд.if mask_h * hi + mask_l * lo <= x then
- если результат выражения не большеx
, выполняется следующий блок команд.inc(n)
- увеличивает значение переменнойn
на 1.else goto qt
- иначе выполняется переход к меткеqt
.
- Метка и дополнительный подсчет:
qt:
- меткаqt
.n := n + p * 81
- к значению переменнойn
прибавляется произведениеp
на 81.
- Вывод результата и ожидание ввода:
writeln(n)
- выводится значениеn
.readln
- ожидание ввода перед завершением программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д