Найти количество "правильных" чисел - 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- ожидание ввода перед завершением программы.