В этой статье мы подробно разберём, как подсчитать количество «старших» цифр (со значением от 10 до 26) в записи произвольного целого числа в системе счисления с основанием 27. Поясним, почему такая задача может быть полезной, и предложим несколько вариантов реализации – от простого псевдокода до готовых функций на популярных языках программирования.
Что такое 27‑ричная система счисления?
Система счисления с основанием 27 использует 27 различных символов для представления цифр:
- Цифры 0–9 обозначают значения 0–9.
- Буквы A–Q (или любые другие ) представляют значения 10–26.
Таким образом, любая позиция в 27‑ричной записи хранит число от 0 до 26 включительно, а вес каждой позиции растёт по степеням 27:
N = d_k·27^k + d_{k-1}·27^{k-1} + … + d_1·27 + d_0,
где 0 ≤ d_i ≤ 26 Формулировка задачи
Дано целое неотрицательное число N. Требуется:
- Записать N в 27‑ричной системе.
- Подсчитать, сколько цифр в этой записи имеют числовое значение больше 9 (т.е. равны 10…26).
Ответом будет целое число C – количество «старших» цифр.
Пример работы
| N (десятичное) | 27‑ричная запись | Старшие цифры | C |
|---|---|---|---|
| 0 | 0 | — | 0 |
| 27 | 10 | 1 (значение 1) – не считается | 0 |
| 100 | 3R (3·27 + 19) | R=19 → старшая | 1 |
| 12345 | 1KJ (1·27² + 20·27 + 19) | K=20, J=19 → обе старшие | 2 |
Алгоритм решения
Самый простой способ – повторно делить число на 27 и проверять остаток:
- Инициализировать счётчик cnt = 0.
- Пока N > 0:
- Вычислить rem = N mod 27 (остаток от деления).
- Если rem > 9 → увеличить cnt на 1.
- Заменить N = N div 27 (целочисленное деление).
- По завершении цикла cnt содержит требуемый результат.
Эта процедура работает за O(log_{27} N) шагов – количество цифр в 27‑ричной записи.
Псевдокод
function countHighDigits(N): cnt ← 0 while N > 0: rem ← N mod 27 if rem > 9: cnt ← cnt + 1 N ← N div 27 return cnt
Реализация на разных языках
5.1 Python
def count_high_digits(n: int) -> int:
"""Возвращает количество цифр >9 в 27‑ричной записи числа n."""
cnt = 0
while n:
n, rem = divmod(n, 27)
if rem > 9:
cnt += 1
return cnt
print(count_high_digits(12345)) # → 2 5.2 C++
#include <iostream>
int countHighDigits(long long n) {
int cnt = 0;
while (n > 0) {
int rem = n % 27;
if (rem > 9) ++cnt;
n /= 27;
}
return cnt;
}
int main {
std::cout << countHighDigits(12345) << std::endl; // 2
return 0;
} 5.3 JavaScript
function countHighDigits(n) {
let cnt = 0;
while (n > 0) {
const rem = n % 27;
if (rem > 9) cnt++;
n = Math.floor(n / 27);
}
return cnt;
}
// Пример
console.log(countHighDigits(12345)); // 2
Оптимизации и альтернативные подходы
- Предвычисление таблицы. Если требуется выполнять задачу многократно для разных
N, можно заранее посчитать количество «старших» цифр для всех чисел от 0 до 26 и хранить их в массивеhigh[27]. Затем каждый шаг деления просто обращается к этому массиву. - Bit‑mask. Поскольку порог 9 фиксирован, можно проверять условие
rem > 9через сравнение с константой 0xA. - Векторизованные операции. При больших объёмах данных (например, миллионы чисел) удобно воспользоваться SIMD‑инструкциями, но это уже выходит за рамки базовой задачи.
Где может понадобиться такой подсчёт?
Подсчёт цифр с высоким значением встречается в:
- Криптографических алгоритмах, где используется нестандартное основание для усиления энтропии.
- Сжатии данных: в некоторых схемах используется запись в базе 27 для представления буквенно‑цифровых символов.
- Генерации уникальных идентификаторов (UUID‑like) с ограниченным набором символов.
- Обучающих задач по программированию – отличная практика работы с системами счисления.
Часто задаваемые вопросы
8.1 Можно ли решить задачу без деления?
Да. Если известна длина записи (количество цифр), можно преобразовать число в строку с помощью функции toString(27) (в JavaScript) и пройтись по символам, проверяя их код. Но внутренне язык всё равно делит число, так что алгоритмически различий нет.
8.2 Как обрабатывать отрицательные числа?
Для задачи в контексте «цифр» обычно рассматривают только неотрицательные целые. Если всё же требуется, можно взять абсолютное значение abs(N) перед началом процесса.
8.3 А что если основание отличается от 27?
Алгоритм полностью аналогичен: меняем только порог 9 → base-1 и значение сравниваемого предела (в нашем случае фиксировано 9, потому что интересуемся цифрами >9).
Волшебный совет
Трюк для быстрого прототипа: в Python можно воспользоваться встроенной функцией numpy.base_repr для получения строки в любой системе счисления, а затем подсчитать «старшие» символы одной строкой:
import numpy as np
def magic_count(n):
s = np.base_repr(n, base=27) # получаем строку, например '1KJ'
return sum(1 for ch in s if ch.isalpha) # буквы = значения >9
Такой «магический» приём избавляет от ручного цикла и делает код лаконичнее.
Подсчёт количества цифр со значением более 9 в 27‑ричной записи числа – задача простой, но полезной при работе с нестандартными системами счисления. Мы рассмотрели теорию, привели строгий алгоритм, предоставили готовый код на трёх популярных языках и обсудили варианты оптимизаций. Теперь вы можете смело применять эти знания в проектах, связанных с кодированием, криптографией или просто в учебных упражнениях.