Engee 文档
Notebook

计算"彩色数字"的算法

这个例子演示了在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]:
iscolorful
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("最大可能的颜色数最大。")
    println("彩色数字的总数为$csum。")
end
Out[0]:
testcolorfuls (generic function with 1 method)

调用测试函数

让我们运行主代码来获得结果。

In [ ]:
testcolorfuls()
Цветные числа для диапазонов 1:25, 26:50, 51:75, и 76:100:
1    2    3    4    5    6    7    8    9    23   24   25   
26   27   28   29   32   34   35   36   37   38   39   42   43   45   46   47   48   49   
52   53   54   56   57   58   59   62   63   64   65   67   68   69   72   73   74   75   
76   78   79   82   83   84   85   86   87   89   92   93   94   95   96   97   98   
Количество цветных чисел между         0 и         9 - 10.
Количество цветных чисел между        10 и        99 - 56.
Количество цветных чисел между       100 и       999 - 328.
Количество цветных чисел между      1000 и      9999 - 1540.
Количество цветных чисел между     10000 и     99999 - 5514.
Количество цветных чисел между    100000 и    999999 - 13956.
Количество цветных чисел между   1000000 и   9999999 - 21596.
Количество цветных чисел между  10000000 и  99999999 - 14256.
Максимально возможное цветное число - 98746253.
Общее количество цветных чисел - 57256.

结论

我们回顾了Julia语言中"彩色数字"概念的实现。 该程序允许您找到这些数字,确定它们在指定边界内的唯一性,并计算它们的总数和最大值。
这在研究数字的属性方面很有用,可以应用于数论问题或逻辑谜题。
它使用与集合的工作,子阵列的递归分析和全局变量的管理。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Colorful_numbers