Рекурсивный перевод системы счисления
Создано: 22 января 2025 г.
Создано: 22 января 2025 г.
«В»: Напишите рекурсивную процедуру, которая переводит число в любую систему счисления с основанием от 2 до 9.
Пример:
Введите число: 75
Основание: 6
В системе с основанием 6: 203
Ниже приведён пример рекурсивной функции на языке Pascal, которая переводит целое число в систему счисления с основанием от 2 до 9. Для демонстрации взят пример с числом 75 и основанием 6 (результат должен получиться «203»). Вы можете адаптировать логику под любой другой язык, принцип останется тем же.
pascalprogram ConvertBase; uses SysUtils; // Для функции IntToStr // Рекурсивная функция для перевода числа `n` в систему счисления с основанием `base` function ConvertToBase(n, base: Integer): String; var remainder: Integer; begin // Базовый случай рекурсии: // Если число меньше основания, то результат — это просто "цифра" числа if n < base then ConvertToBase := IntToStr(n) else begin // Находим остаток от деления (последняя "цифра" в новой системе счисления) remainder := n mod base; // Рекурсивно переводим целую часть деления, а затем дописываем цифру ConvertToBase := ConvertToBase(n div base, base) + IntToStr(remainder); end; end; var num, b: Integer; begin Write('Введите число: '); ReadLn(num); Write('Введите основание (от 2 до 9): '); ReadLn(b); // Вызываем рекурсивную функцию и выводим результат WriteLn('В системе с основанием ', b, ': ', ConvertToBase(num, b)); end.
Чтение входных данных:
num — число, которое нужно перевести.b — основание системы счисления (от 2 до 9).Рекурсивная функция ConvertToBase(n, base):
n < base, функция сразу возвращает строковое представление n, так как оно уже меньше основания и является «последней цифрой».n >= base, функция разбивает число на:
base: n div base.base: n mod base — это будет «последняя цифра» в системе счисления.ConvertToBase(n div base, base) (уменьшаем число) и к результату приписывается IntToStr(remainder).Вывод: результатом функции является строка, содержащая представление числа в новой системе счисления.
Пример: при вводе 75 и основании 6 программа выдаст
203, что соответствует:
Такой подход можно легко перенести в другие языки программирования (C, C++, Java, Python и т.п.) с учётом особенностей синтаксиса. Главное — сохранить логику: в рекурсивной функции делим число на основание, накапливаем остатки, пока не достигнем базового случая.
«В»: Напишите рекурсивную процедуру, которая переводит число в любую систему счисления с основанием от 2 до 9.
Пример:
Введите число: 75
Основание: 6
В системе с основанием 6: 203 через рекурствную функцию
Ниже приведён пример рекурсивной процедуры (не функции) на языке Pascal, которая выводит число n в систему счисления с основанием base (от 2 до 9). В примере при вводе 75 и основании 6 результатом будет 203.
pascalprogram ConvertBaseRecursive; uses SysUtils; (* Рекурсивная процедура вывода числа `n` в систему счисления с основанием `base`. Идея: 1) Если n < base, выводим n напрямую. 2) Иначе сначала рекурсивно выводим результат деления n на base, а затем выводим остаток от деления (n mod base). *) procedure ConvertToBaseRecursive(n, base: Integer); begin // Базовый случай рекурсии: если число меньше основания, выводим его как есть if n < base then Write(n) else begin // Сначала выводим старшие «цифры» ConvertToBaseRecursive(n div base, base); // Затем выводим остаток (младшую "цифру") Write(n mod base); end; end; var num, b: Integer; begin Write('Введите число: '); ReadLn(num); Write('Введите основание (от 2 до 9): '); ReadLn(b); Write('В системе с основанием ', b, ': '); // Вызываем рекурсивную процедуру ConvertToBaseRecursive(num, b); WriteLn; // Переход на новую строку end.
Условие if n < base
n становится меньше, чем base, мы можем напрямую вывести n, так как оно уже представляет собой «одну цифру» в нужной системе счисления.Рекурсивный вызов
n >= base, разбиваем число на:
n div base. Сначала рекурсивно выводим её.n mod base. Добавляем его «цифрой» в конце.Наглядный пример для 75 в системе с основанием 6
Таким образом, процедура последовательно выводит «цифры» (остатки), формируя требуемое представление числа в системе счисления с основанием base.
Через def
Ниже приведён пример на языке Python, где рекурсивная «процедура» (в Python — функция без возвращаемого значения) выводит число n в системе счисления с основанием base (от 2 до 9). При вводе числа 75 и основании 6 вывод будет 203.
pythondef convert_to_base(n, base): """ Рекурсивно выводит число n (целое) в системе счисления с основанием base. """ # Базовый случай: если число меньше основания, выводим его без перехода на новую строку if n < base: print(n, end='') else: # Сначала рекурсивно обрабатываем целую часть от деления convert_to_base(n // base, base) # Затем выводим остаток (младшую "цифру") print(n % base, end='') def main(): # Считываем исходное число num = int(input("Введите число: ")) # Считываем основание системы счисления b = int(input("Введите основание (от 2 до 9): ")) print(f"В системе с основанием {b}:", end=' ') # Вызываем рекурсивную функцию, которая напечатает результат convert_to_base(num, b) # Переход на новую строку после вывода результата print() if __name__ == "__main__": main()
Функция convert_to_base(n, base)
n < base, мы просто выводим n без перехода на новую строку (аргумент end='' в print).n >= base, разбиваем число на:
n // base);n % base).Функция main()
num.b.convert_to_base(num, b), которая печатает итоговое представление числа в системе счисления.Пример
75 и основании 6 программа выведет 203.При необходимости можно изменить логику так, чтобы функция возвращала строку, а не выводила её напрямую. Однако для «процедурного» варианта достаточно вышеописанного способа печати внутри рекурсии.
«В»: Напишите рекурсивную процедуру, которая переводит число в любую систему счисления с основанием от 2 до 9.
Пример:
Введите число: 75
Основание: 6
В системе с основанием 6: 203 через def без функций
Ниже приведён пример кода на Python, в котором определяется одна рекурсивная процедура (через def) и нет никаких других функций, кроме неё. Она сразу выводит число n в системе счисления с основанием base, не возвращая значение.
pythondef convert_to_base_recursive(n, base): """ Рекурсивно выводит число n (целое) в системе счисления с основанием base (от 2 до 9). Ничего не возвращает, только печатает результат. """ if n < base: print(n, end='') # Базовый случай: выводим число, если оно меньше основания else: convert_to_base_recursive(n // base, base) print(n % base, end='') # Выводим «младшую» цифру после рекурсивного вызова # Считываем исходное число num = int(input("Введите число: ")) # Считываем основание (от 2 до 9) b = int(input("Введите основание (от 2 до 9): ")) # Выводим результат print(f"В системе с основанием {b}:", end=' ') convert_to_base_recursive(num, b) print() # Перевод на новую строку
Входные данные
num — исходное десятичное число.b — основание системы счисления (2–9).Рекурсивная процедура convert_to_base_recursive(n, base)
n.convert_to_base_recursive(n // base, base), чтобы вывести «старшую» часть числа.n % base) — это «младшая» цифра в системе счисления.Пример
2. После этого возвращаемся по рекурсии назад и допечатываем 0, затем 3. Итог: 203.В итоге при вводе 75 и основании 6, на экран будет выведено:
В системе с основанием 6: 203
«В»: Напишите процедуру, которая выводит на экран в столбик все цифры переданного ей числа, начиная с первой. Через процедуру на питон
Ниже приведён простой пример на Python в виде процедуры (функции, не возвращающей значение), которая выводит на экран все цифры переданного числа построчно (в столбик), начиная с первой (левой) цифры:
pythondef print_digits_in_column(n): """ Выводит все цифры числа n в столбик, начиная с первой (левой). """ # Преобразуем число в строку s = str(n) # Печатаем каждый символ (цифру) на новой строке for digit in s: print(digit) # Пример использования num = int(input("Введите число: ")) print_digits_in_column(num)
Преобразование в строку:
Мы используем str(n), чтобы обойтись без явных математических вычислений. Каждый символ в строке — это отдельная цифра (либо знак - для отрицательных чисел).
Построчный вывод:
Цикл for digit in s: поочерёдно берёт каждый символ строки s (то есть каждую цифру, а также знак «минус», если число отрицательное) и выводит его вызовом print(digit). Каждый вызов print() по умолчанию переходит на новую строку.
Обработка отрицательных чисел:
Если число отрицательное, первым символом окажется -. Он тоже будет выведен на отдельной строке. Если нужно выводить только цифры без знака, можно предварительно взять модуль числа:
pythons = str(abs(n))
Пример:
12345text1 2 3 4 5
Таким образом, функция print_digits_in_column является процедурой, поскольку она не возвращает значение, а лишь выводит результат напрямую в консоль.
Без str
Ниже приведён пример процедуры (функции без возвращаемого значения) на Python, которая выводит все цифры числа в столбик без использования str(). Она обрабатывает также и отрицательные числа, выводя сначала знак «минус» на отдельной строке:
pythondef print_digits_in_column(n): """ Выводит на экран в столбик все цифры числа n, начиная с первой (левой), без использования str(). """ # Если число отрицательное — сначала печатаем знак '-', а затем работаем с модулем if n < 0: print('-') n = -n # Специальный случай, если n == 0 if n == 0: print(0) return # Находим наибольшую степень 10, не превосходящую n. # Например, если n=1234, то p станет 1000. p = 1 while p <= n: p *= 10 p //= 10 # Пока p не обнулится, "срезаем" и выводим левую цифру числа while p > 0: digit = n // p # получаем текущую левую цифру print(digit) # выводим цифру в столбик n = n % p # убираем левую цифру из числа p //= 10 # переходим к следующей (меньшей) степени 10 # Пример использования num = int(input("Введите число: ")) print_digits_in_column(num)
Обработка знака
-, а затем переходим к положительному -n.Случай
0 и завершаем работу.Поиск наибольшей степени 10
while p <= n: p *= 10 подбираем такое p, чтобы p стало больше, чем , а затем делаем p //= 10.p — это «столб» (степень 10) для самой левой цифры.p будет равно 1000.Цикл вывода цифр
while p > 0::
digit = n // p.1.digit.n = n % p.p: p //= 10, переходим к следующей (меньшей) цифре.Пример
p: сначала p=1, затем p=10 (меньше или равно 75?), затем p=100 (уже 100 > 75), поэтому p=100 // 10 = 10.digit = 75 // 10 = 7, выводим 7.digit = 5 // 1 = 5, выводим 5.text7 5
Таким образом, мы рекурсивные или нерекурсивные действия здесь не используем, но явно работаем с математикой (деление на 10, остаток от деления) и не применяем str().
Реши за 4 строчки на питон через процедуру
Ниже — кратчайший пример (4 строки кода), где рекурсивная процедура выводит все цифры числа в столбик, начиная с первой (левой). Строковые операции не используются:
pythondef print_digits(n): if n < 0: print('-'); print_digits(-n) elif n < 10: print(n) else: print_digits(n // 10); print(n % 10)
Как это работает:
Так выводится каждая цифра на новой строке, начиная от самой левой.
Задачи «А»: Напишите логическую функцию, которая возвращает значение «истина», если десятичная запись числа заканчивается на цифру 0 или 1.
Пример:
Введите число: 1230
Ответ: Да
Ниже приведён пример на языке Python. Логическая (булева) функция ends_with_0_or_1 возвращает True, если десятичная запись числа оканчивается на 0 или 1, и False — в противном случае. В основной части кода используем результат функции, чтобы вывести «Да» или «Нет»:
pythondef ends_with_0_or_1(n): """ Возвращает True, если десятичная запись числа n заканчивается на 0 или 1. Иначе возвращает False. """ last_digit = abs(n) % 10 # Берём модуль числа, чтобы обработать и отрицательные значения return last_digit == 0 or last_digit == 1 # Пример использования num = int(input("Введите число: ")) if ends_with_0_or_1(num): print("Да") else: print("Нет")
Модуль числа:
Используем abs(n), чтобы корректно обработать отрицательные числа (например, тоже заканчивается на цифру 1).
Проверка последней цифры:
abs(n) % 10.Вывод:
ends_with_0_or_1(num) вернёт True, печатаем «Да», иначе — «Нет».Пример: для входного числа
1230,abs(1230) % 10 = 0, значит функция вернётTrue, и будет выведено «Да».
Ниже кратко разобран типичный для задач на «Черепаху» (Logo-подобный алгоритм) пример, когда серия команд образует несколько прямоугольников, и требуется найти площадь наименьшего из них. Алгоритм (по тексту) выглядит примерно так (упрощённая запись):
При этом из описания следует, что в итоге образуются три невзаимно пересекающихся прямоугольника (или же два больших и один «промежуточный»), если учитывать движение «Вперёд 173, Налево 90, Вперёд 254, Направо 90» как ещё один замкнутый контур. На практике в подобных заданиях это означает:
Прямоугольник A со сторонами 550 и 228
Площадь:
Прямоугольник B «промежуточный» со сторонами 173 и 254 (если из текста понятно, что эти отрезки тоже образуют замкнутый прямоугольник; иногда это прямо оговорено или следует из логики «Повтори 2» и дополнительных команд).
Площадь:
Прямоугольник C со сторонами 156 и 708
Площадь:
Сравнивая площади:
Очевидно, наименьшая площадь здесь — это
В итоге самый маленький прямоугольник имеет площадь
184)* означает, что последовательность из S команд повторится k раз. Черепахе был дан для
исполнения следующий алгоритм:
Поднять хвост
Повтори 10 [Вправо 120 Вперед 10] Опустить хвост
Повтори 7 [Вперед 15 Вправо 90] Повтори 5 [Вправо 60 Вперед 20 Вправо 30]
В каждом из двух последних циклов Черепаха рисует замкнутый контур. Сколько точек с целочисленными координатами находится внутри области пересечения фигур, ограниченных
этими контурами? Точки на линиях следует учитывать.
185) * означает, что последовательность из S команд повторится k раз. Черепахе был дан для
исполнения следующий алгоритм:
Повтори 8 [Вперёд 16 Направо 90 Вперёд 22 Направо 90] Поднять хвост Вперёд 5 Направо 90 Вперёд 5 Налево 90 Опустить хвост Повтори 8 [Вперёд 52 Направо 90 Вперёд 77 Направо 90]
Определите площадь области пересечения фигур, ограниченных заданными алгоритмом линиями. В ответе укажите только число. Единицу измерения указывать не нужно.
186) означает, что последовательность из S команд повторится k раз. Черепахе был дан для
исполнения следующий алгоритм:
Поднять хвост
Повтори 10 [Вправо 120 Вперед 12]
Опустить хвост
Повтори 7 [Вперед 7 Вправо 90]
Повтори 5 [Вправо 60 Вперед 20 Вправо 30]
В каждом из двух последних циклов Черепаха рисует замкнутый контур. Сколько точек с целочисленными координатами находится внутри области пересечения фигур, ограниченных
этими контурами? Точки на линиях учитывать не следует.
Ниже дан общий комментарий по тому, как решаются подобные задачи (№184–186 и им подобные) из серии «Черепаха рисует фигуры, найти площадь/количество целочисленных точек во пересечении и т.п.». К сожалению, без подробного пошагового разбора каждого поворота и перемещения невозможно мгновенно назвать точное числовое решение. Однако вы сможете самостоятельно (или с помощью краткого скрипта) воспроизвести траекторию Черепахи и вычислить нужную величину.
Расположение и ориентация Черепахи
Пошаговый перевод команд в координаты
Вперёд x (или Forward x) смещает Черепаху на единиц в текущем направлении.Направо \alpha (или Right \alpha) и Налево \alpha (или Left \alpha) меняют текущий угол ориентации.Учёт поднятого хвоста
Поднять хвост), Черепаха перемещается, не рисуя линий.Опустить хвост), она оставляет за собой отрезок (ребро будущего многоугольника).Формирование многоугольников
Нахождение пересечения фигур
Вычисление площади или числа целочисленных точек
Повтори k [Вперёд x, Направо (или Налево) y, ...]shapely в Python),Если нужны точки внутри и на границе:
Если нужны точки строго внутри (как в №186, «точки на линии не учитывать»):
Во многих школьных задачах ЕГЭ/ОГЭ на Черепаху встречаются повторения, которые, на первый взгляд, не дают классический «четырёхугольник» или «треугольник» (например, Повтори 7 [Вперёд 15, Вправо 90]). На самом деле:
Часто в условии прямо сказано: «В каждом из последних двух циклов получается замкнутый контур», и на ЕГЭ это принимается как данность, даже если «шаги» выглядят нетипично.
Задачи #184, #185 и #186 — это разные конкретные тексты, которые требуют полноценного ручного/программного разбора:
№184 и №186:
№185:
Без детальной прорисовки (или скрипта) получить точное число нельзя. Тем более задания специально составлены так, что «автоматическая» догадка по количеству повторов и углам не всегда очевидна.
Если задача из школьного экзамена (ОГЭ/ЕГЭ)
Если можно использовать Python
pythonimport math def turtle_path(commands): # commands — список (или генератор) вида [('F', 10), ('R', 120), ...] # Реализовать учёт подъёма/опускания хвоста. # Возвращает список вершин (x, y) замкнутого контура, # либо несколько таких контуров (если между командами хвост поднимался/опускался). pass # Потом находите пересечение фигур (через shapely или вручную). # Дальше либо считаем площадь, либо считаем целочисленные точки.
Задачи №184, №185, №186 (и подобные) — это классическая геометрия с Чертёжником/Черепахой. Алгоритм решения:
Готового «однокнопочного» ответа на каждую из трёх задач нет, потому что все они требуют аккуратного прохождения команд. В реальной практике (на экзамене) такие задания обычно решаются «руками», пошагово, и получают вполне конкретное число.
Если у вас есть исходный разбор (или вы сами шаг за шагом выписали координаты), можете прислать — тогда можно будет конкретно вычислить либо площадь, либо количество целочисленных точек для каждого из номеров 184, 185, 186. Но в текущем виде, когда даны лишь тексты команд, это стандартная геометрическая задача, где без «трассировки» маршрута нельзя сразу выдать единственно правильное число.
184)* означает, что последовательность из S команд повторится k раз. Черепахе был дан для исполнения следующий алгоритм:
Поднять хвост
Повтори 10 [Вправо 120 Вперед 10]
Опустить хвост
Повтори 7 [Вперед 15 Вправо 90]
Повтори 5 [Вправо 60 Вперед 20 Вправо 30]
В каждом из двух последних циклов Черепаха рисует замкнутый контур. Сколько точек с целочисленными координатами находится внутри области пересечения фигур, ограниченных этими контурами? Точки на линиях следует учитывать.
Ниже разъяснено, как в подобных задачах (включая предложенную № 184) можно определить, сколько целочисленных точек лежит во пересечении двух многоугольников, построенных Черепахой. Сразу заметим:
Повтори 10 [...]) хвост поднят, значит он не рисует фигуру — это лишь «прогулка» до некоего положения/ориентации.Смоделировать движения Черепахи пошагово:
Выделить два замкнутых полигона:
Повтори 7 [Вперёд 15 Вправо 90]Повтори 5 [Вправо 60 Вперёд 20 Вправо 30]Найти пересечение этих двух многоугольников.
Подсчитать целочисленные точки:
В задаче:
Повтори 10 [Вправо 120 Вперёд 10] сдвигает Черепаху в неочевидное место (и под неочевидным углом).
Повтори 5 [Вправо 60 Вперёд 20 Вправо 30] рисует другой замкнутый контур, уже начиная с новой позиции/угла, сформировавшейся по итогам второго блока.Чтобы точно узнать размер и местоположение каждого многоугольника и затем их пересечение, необходимо либо:
shapely / «лучевым» алгоритмом), который по шагам выполнит команды Черепахи и построит полигончики.Только затем, имея явные координаты обеих фигур, вы найдёте их пересечение и сумеете посчитать количество целочисленных точек, причём «включая граничные».
Конкретное значение (например, «1» или «2») обычно выясняется только после полной прорисовки.
Без подробного разбора поворотов и координат (или без готовой «официальной» таблицы движений) невозможно назвать одно-единственное число. В заданиях ЕГЭ/ОГЭ обычно это число невелико (от 0 до нескольких единиц) и получается чисто геометрическим расчётом.
Если у вас есть готовое пошаговое решение (из сборника или методички), то там в конце может быть, к примеру, ответ «1» или «2» и т. п. Но чтобы это доказать, нужно выполнить описанные выше действия.
Итог:
- Задача требует аккуратной «трассировки» Черепахи.
- Как правило, результат — небольшое целое число (количество точек).
- Точное значение без полного «прогона» алгоритма назвать нельзя.