Определить цифру, стоящую на к-том месте последовательности. - PascalABC.NET
Формулировка задачи:
Дана последовательность натуральных чисел 12456789101112131415161718192021...
Написать программу для определения цифры, стоящей на к-том месте той последовательности.
Формат входных данных
Стока файла содержит позицию К.
Формат выходных данных
Выходной файл содержит цифру, стоящую на к-том месте этой последовательности.
написал что-то такое... Но это не работает.
что-то вообще я не то написал... Поможете?
Решение задачи: «Определить цифру, стоящую на к-том месте последовательности.»
textual
Листинг программы
function get_digit(n: longint): char; var i: longint; digits: byte; start_of, maximal: longint; num_of_n, num_of_digit: integer; s: string; begin digits := 1; start_of := 0; maximal := 9; while n > digits * maximal + start_of do begin inc(digits); maximal := maximal * 10; inc(start_of, pred(digits) * (maximal div 10)); end; maximal := maximal div 10; dec(n, start_of); num_of_n := (n div digits) + ord((n mod digits) <> 0); num_of_digit := n - digits * pred(num_of_n); n := 1; for i := digits downto 2 do n := n * 10; str(n + pred(num_of_n), s); get_digit := s[num_of_digit]; end; begin writeln(get_digit(ReadInteger())); end.
Объяснение кода листинга программы
В этом коде определена функция под названием get_digit, которая принимает целочисленный аргумент n. Функция извлекает цифру, находящуюся на определенном месте в числе n. В частности, функция извлекает цифру, стоящую на k-м месте, где k - это число, введенное пользователем.
Код выполняет следующие действия:
- Устанавливает переменную
digitsравной 1, которая представляет собой текущую позицию, на которой ищется цифра. - Устанавливает переменную
start_ofравной 0, которая представляет собой начальную позицию в числеn, с которой начинается поиск. - Устанавливает переменную
maximalравной 9, которая представляет собой максимальное количество цифр, которое может быть извлечено из числаn. - Входит в цикл while, который продолжается до тех пор, пока
nбольше, чемdigitsумноженное наmaximalи прибавленноеstart_of. - Внутри цикла увеличивает значение
digitsна 1, чтобы перейти к следующей позиции. - Увеличивает значение
maximalна 10, чтобы проверить следующую позицию. - Увеличивает значение
start_ofна предыдущее значениеdigits, умноженное на 10, чтобы перейти к следующей группе из 10 цифр. - После выхода из цикла, устанавливает
maximalравным его последнему значению, деленному на 10, чтобы найти последнюю группу из 10 цифр. - Уменьшает значение
nнаdigits, умноженное на предыдущее значениеdigits, чтобы удалить уже извлеченные цифры. - Устанавливает значение
num_of_nравным суммеnи 48 (код ASCII для цифры 1), плюс количество цифр, которые уже были извлечены. - Устанавливает значение
num_of_digitравнымn, минусdigits, умноженное на предыдущее значениеdigits. - Устанавливает
nравным 1, и затем умножает его на 10 в цикле for, чтобы установить каждую позицию вnравной 0. - Строка
sустанавливается равной строковому представлениюn. - Функция
get_digitвозвращает значениеs, с индексом, равнымnum_of_digit. - В основной программе функция
get_digitвызывается с аргументом, введенным пользователем, и результат выводится на консоль.