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秒。

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]就可以得到所有的七位数的水仙花数,耗时也较少。

3、IntegerDigits[n]把整数n拆分成单个数字,此时的n必须是整数;如果是负数,负号会被忽略。

4、仍旧是用If语句进行甄别和筛选,但是,当位数超过7以后,耗时明显增加了一大截。下面列出3位数到7位数的所有水仙花数:f[#]&/@Range[3,7]

5、如果先针对个位数进行判断,或许会容易不少;注意到n^8的个位数只能是0,1,5,6:Table[IntegerDigits[n^8][[-1]], {n, 1, 10}]

6、这样,无需计算数字的呖分甾胗8次方,只需要判断数字是不是2和5的倍数,就可以知道n^8的个位数字:xx[n_] :=Pie艘早祓胂cewise[{{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]

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]也还是很慢,半天没出结果。