编程求解1~15位“水仙花”数

前面我们已经知道“水仙花”数其实就是3位的“自幂数”。在100~999这900个3位数中也只有153、370、371、407这4个3位的“自幂数”。寻找“自幂数”显然是和大量的计算联系在一起的。即便是计算这900个数的每一个数位的3次乘方,再求和,也是可以想得到的繁杂运算。早在80年前电子计算机还没有开始应用的年代,就有许多人依靠笔算去寻找“自幂数”了。如果是要寻找39位的“自幂数”,想想看有多少个39位数,每一个数还要对每个数位计算39次乘方,然后求和……计算量真是大得难以想象。到目前为止,人们已经知道十进制数只有88个“自幂数”,最大的“自幂数”是39位的“自幂数”。但是无论是笔算还是计算机计算,都是找不到符合条件的2位“自幂数”的。
不过林老师孤陋寡闻地认为,3位的“自幂数”与“水仙花”并没有必然的联系。只不过开始有人这么称呼,现在大家都把3位的“自幂数”叫做“水仙花数”了。但是使用电子计算机来计算“自幂数”——依靠计算机的高速运算来完成那么巨大的计算工作量,才有可能找到数位更多的“自幂数”。使用LOGO语言编程,其中并没有什么太复杂的原理,只要前面几篇博客都看懂了,下面这个程序也是很容易理解的。用LOGO编程求解“自幂数”,PCLogo只能求解1~6位,因为大于6位的数字PCLogo系统就会将之作为“科学计数法浮点数”来处理。相比之下下面提供的MSWLogo-FMSLogo程序是有可能计算出1~15位“自幂数”的。经过林老师的编程运行实践,发现计算1~8位“自幂数”需要6494.26秒钟(不同硬件品质的计算机所需的时间可能有所不同)。6494秒钟已经快两个小时了。仔细观察一下,每增加1个数位的“自幂数”的计算,时间要增加10倍都不止。真要计算到15位“自幂数”就需要6494秒钟的10000000倍以上的时间:1天86400秒钟,1年365天。这就需要远超千年以上的时间!所以还是仅仅计算1~8位“自幂数”为妥,这是在人们的精力、计算机硬件的耐力所能允许的范围之内可以实现的事。
to
sxh_f ;for
MSWLogo-FMSLogo
make "m [[] [无] [] [] [] [] [] []
[] []]
make "g 0
;自幂数的个数清零
make "nn 1
;数字的位数从1位开始寻找
make "t0 timemilli
;记录这一轮开始计算的时间
make "t00 :t0
;记录全部计算开始的时间
type :nn type "位自幂数: pr item :nn
:m ;输出每轮计算的眉头
for[i 1 99999999][
;产生1~8位数所有的数字
make "h
0
;在对每个数字进行计算时将累加和清零
make "n count :i
;计算这个数字的位数
if
:n>:nn[
;如果:n>:nn说明开始多了一位数
type "以上共有 type :g pr "个数字
;输出这一轮共找到了几个自幂数
make "t1 timemilli
;计算当下即时时间
type "这一部分计算了 type (:t1-:t0)/1000 pr "秒钟
pr[]
;输出前一轮计算的累计秒数
make "nn :n
;:nn是下一组自幂数的位数
type :nn type "位自幂数: pr item :nn
:m ;输出下一轮自幂数的眉头
make "t0 timemilli
make "g 0
make "h 0]
for[j 1
:n][
;对当前数字的:n个数位逐个累加自幂数的和
make "h :h+power (item :j :i)
:n]
if
:h=:i[
;如果符合自幂数的条件就输出这个自幂数
pr :i
make "g :g+1]] ;当下自幂数的个数累加1
type "以上共有 type
:g pr "个数字 ;在这一批自幂数的末尾输出有关信息
make "t1
timemilli
type "这一部分计算了
type(:t1-:t0)/1000 pr "秒钟 pr[]
make "t1
timemilli
;记录全部计算终了的时间点
type "整个计算用了 type (:t1-:t00)/1000
pr "秒钟 ;输出整个计算的时间
end
程序里面有一个“表”数据make
"m [[] [无] [] [] [] [] [] [] [] []]是用来“装”1~10位“自幂数”名称的空间。例如3位的“自幂数”是“水仙花”。这些名称请自己到百度中搜索“水仙花数”词条,找到后照样录入。
1位自幂数:
1
2
3
4
5
6
7
8
9
以上共有9个数字
这一部分计算了0.063秒钟
2位自幂数:无
以上共有0个数字
这一部分计算了0.016秒钟
3位自幂数:
153
370
371
407
以上共有4个数字
这一部分计算了0.046秒钟
4位自幂数:
1634
8208
9474
以上共有3个数字
这一部分计算了0.406秒钟
5位自幂数:
54748
92727
93084
以上共有3个数字
这一部分计算了4.243秒钟
6位自幂数:
548834
以上共有1个数字
这一部分计算了47.658秒钟
7位自幂数:
1741725
4210818
9800817
9926315
以上共有4个数字
这一部分计算了535.926秒钟
8位自幂数:
24678050
24678051
88593477
以上共有3个数字
这一部分计算了5905.777秒钟
整个计算用了6494.26秒钟
加载中,请稍候......