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

 时间:2024-10-24 22:20:50

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_] :=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]

第二种搜寻水仙花数的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]也还是很慢,半天没出结果。

  • 如何使用MATLAB进行曲线拟合
  • 如何使用matlab进行多项式拟合
  • matlab怎么求解方程
  • MATLAB如何做拟合?lsqcurvefit函数怎么使用?
  • matlab中线性规划优化计算方法和实例
  • 热门搜索
    运动粘度单位 as as是什么意思 大便干燥是什么原因 蛭石是什么 胎停有什么症状 2333什么意思 爽肤水有什么用 养殖基地 competition是什么意思 什么水果美白