第二种搜寻水仙花数的Mathematica算法

2025-10-25 02:20:05

1、前文的代码,来寻找七位数的水仙花数:

Table[If[({a, b, c, d, e, f, g}^7 // Total) == 

      FromDigits[{a, b, c, d, e, f, g}], 

     FromDigits[{a, b, c, d, e, f, g}], 0], {a, 1, 9}, {b, 0, 9}, {c, 

     0, 9}, {d, 0, 9}, {e, 0, 9}, {f, 0, 9}, {g, 0, 9}] // Flatten // 

  Union // AbsoluteTiming

耗时超过20秒。

第二种搜寻水仙花数的Mathematica算法

2、本文的代码,需要构造一个自定义函数:

f[m_] := AbsoluteTiming[

  Table[If[(IntegerDigits[n]^(m) // Total) == n, n, 0], {n, 

      10^(m - 1), 10^m - 1}] // Flatten // Union]

其中,m就是控制数位的变量,比如,f[7]就可以得到所有的七位数的水仙花数,耗时也较少。

第二种搜寻水仙花数的Mathematica算法

3、IntegerDigits[n]

把整数n拆分成单个数字,此时的n必须是整数;

如果是负数,负号会被忽略。

第二种搜寻水仙花数的Mathematica算法

4、仍旧是用If语句进行甄别和筛选,但是,当位数超过7以后,耗时明显增加了一大截。

下面列出3位数到7位数的所有水仙花数:

f[#]&/@Range[3,7]

第二种搜寻水仙花数的Mathematica算法

5、如果先针对个位数进行判断,或许会容易不少;

注意到n^8的个位数只能是0,1,5,6:

Table[IntegerDigits[n^8][[-1]], {n, 1, 10}]

第二种搜寻水仙花数的Mathematica算法

6、这样,无需计算数字的8次方,只需要判断数字是不是2和5的倍数,就可以知道n^8的个位数字:

xx[n_] := 

 Piecewise[{{0, Mod[n, 10] == 0}, {5, Mod[n, 10] == 5}, {1, 

    Mod[n, 5] != 0 && Mod[n, 2] == 1}, {6, 

    Mod[n, 5] != 0 && Mod[n, 2] == 0}}, n]

第二种搜寻水仙花数的Mathematica算法

7、于是,把算法进一步修改为:

AbsoluteTiming[

 Table[If[u[Total[xx[IntegerDigits[n]]]] == u[n], 

    If[(IntegerDigits[n]^8 // Total) == n, n, 0], 0], {n, 10^7, 

    10^8 - 1}] // Union]

也还是很慢,半天没出结果。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢