计算"彩色数字"的算法
这个例子演示了在Julia编程语言中搜索"彩色数字"的算法的实现。
导言
什么是彩色数字?
彩色数字是一个自然数,其中所有数字都不同,并且连续数字的所有可能乘积也不同。 例如,数 它是有色的,因为:
-数字  和  不同的;
-所有数字的乘积()与数字本身不同;
-没有更多的作品。
如果我们拿号码  那么我们应该检查以下工作:
-一次一位数: , , ;
-每位两位数字: , ;
-每位三位数字: .
所有这些值都是唯一的→数字是"有色的"。
功能 iscolorful
检查给定数字是否为"彩色"
争论:
- n:要检查的整数
- base:数字系统(默认为10)
申报表: true/false
    In [ ]:
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
Out[0]:
    In [ ]:
# Глобальная переменная для хранения наибольшего цветного числа
largest = 0;
测试功能(testcolorfuls)
此函数输出从1到100的彩色数字列表,然后计算每个十进制间隔中的彩色数字的数量。
    In [ ]:
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
Out[0]:
调用测试函数
让我们运行主代码来获得结果。
    In [ ]:
testcolorfuls()
结论
我们回顾了Julia语言中"彩色数字"概念的实现。 该程序允许您找到这些数字,确定它们在指定边界内的唯一性,并计算它们的总数和最大值。
这在研究数字的属性方面很有用,可以应用于数论问题或逻辑谜题。
它使用与集合的工作,子阵列的递归分析和全局变量的管理。
该示例是使用[罗塞塔代码]的材料开发的(https://rosettacode.org/wiki/Colorful_numbers )