Цветные числа
Алгоритм вычисления "Цветных чисел"
Этот пример демонстрирует реализацию алгоритма поиска "цветных чисел" на языке программирования Julia.
Введение
Что такое цветные числа?
Цветное число — это натуральное число, у которого все цифры различны, и все возможные произведения подряд идущих цифр также различны. Например, число является цветным, потому что:
- цифры и различны;
- произведение всех цифр () отличается от самих цифр;
- больше никаких произведений нет.
Если мы возьмём число , то должны проверить следующие произведения: - по одной цифре: , , ;
- по две цифры: , ;
- по три цифры: .
Все эти значения уникальны → число "цветное".
Функция iscolorful
Проверяет, является ли данное число "цветным"
Аргументы:
n
: целое число для проверкиbase
: система счисления (по умолчанию 10)
Возвращает: true
/false
function iscolorful(n, base=10)
# Если число меньше 10, оно автоматически считается цветным
0 <= n < 10 && return true
# Получаем массив из цифр числа
dig = digits(n, base=base)
# Исключаем случаи: присутствие 1 или 0,
# либо повторяющиеся цифры – такие числа точно не цветные
(1 in dig || 0 in dig || !allunique(dig)) && return false
# Создаём множество уникальных значений, начинаем с отдельных цифр
products = Set(dig)
# Проходим по всем подстрокам длиной >= 2
# i – длина подстроки (от 2 до длины числа)
# j – начальная позиция подстроки
for i in 2:length(dig), j in 1:length(dig)-i+1
# Вычисляем произведение цифер в текущей группе
p = prod(dig[j:j+i-1])
# Если такое значение уже встречалось, число не цветное
p in products && return false
# Добавляем новое произведение в множество
push!(products, p)
end
# Обновляем глобальную переменную максимального найденного цветного числа
if n > largest
global largest = n
end
return true
end
# Глобальная переменная для хранения наибольшего цветного числа
largest = 0;
Тестирование функциональности (testcolorfuls
)
Данная функция выводит список цветных чисел от 1 до 100, а затем производит подсчёт количества цветных чисел на каждом десятичном интервале.
function testcolorfuls()
println("Цветные числа для диапазонов 1:25, 26:50, 51:75, и 76:100:")
# Цикл по числам от 1 до 100
for i in 1:100
# Если число цветное — выводим его с форматированием
iscolorful(i) && print(rpad(i, 5))
# Разрыв строки каждые 25 чисел
i % 25 == 0 && println()
end
csum = 0 # Общий счётчик цветных чисел
# Подсчитываем цветные числа в диапазонах:
# [0..9], [10..99], ..., [10^7...10^8)
for i in 0:7
# Начальный и конечный элементы интервала
j, k = i == 0 ? 0 : 10^i, 10^(i+1) - 1
# Считаем количество цветных чисел в интервале
n = count(ii -> iscolorful(ii), j:k)
csum += n
# Печатаем результат
println("Количество цветных чисел между $(lpad(j,9)) и $(lpad(k,9)) - $n.")
end
# Итоговой сообщение
println("Максимально возможное цветное число - $largest.")
println("Общее количество цветных чисел - $csum.")
end
Вызов тестовой функции
Запустим основной код, чтобы получить результат.
testcolorfuls()
Заключение
Мы рассмотрели реализацию понятия "цветного числа" на языке Julia. Программа позволяет находить такие числа, определять их уникальность внутри заданных границ, а также вычислять общее их количество и максимальное среди них.
Это полезно при изучении свойств чисел и может быть применено в задачах теории чисел или логических головоломках.
Используется работа со множествами, рекурсивный анализ подмассивов и управление глобальными переменными
Пример разработан с использованием материалов Rosetta Code