用三重循环实现查找“水仙花”数
如果
“水仙花数”无论是在LOGO语言,还是在C、C++、PYTHON编程中都是炙手可热的话题。所谓“水仙花数”指的是“3位的自幂数”。而“自幂数”精确的定义就是:如果一个N位正整数,它的每个数位的N次乘方的和正好等于这个N位正整数,那么这就是一个N位的自幂数。例如153就是一个“水仙花数”,因为1×1×1+5×5×5+3×3×3=153。3位的水仙花数只有4个。如果是更多位数,例如10位、20位的自幂数显然涉及到极大的计算量。所以历来自幂数都是数学家、数学爱好者孜孜以求的求解对象。电子计算机诞生于80年前,40年前微型计算机才开始进入我们的视野,可想而知在此之前完全依靠纸笔计算的年代寻找自幂数那巨大的计算工作量是多么的恐怖!即便是到了现代,使用中等档次的家用计算机,假如是以FMSLogo框架编程,计算1~8位自幂数竟然将近要2个小时才能出结果!MSWLogo-FMSLogo理论上可计算15位整数的自幂数,但是估计要花费1900年以上的时间(这是有科学依据的,后面我们会详细分析)。越是这样,寻找自幂数无论对专业科研工作者、或是业余的数学爱好者都有着极其强大的吸引力。林老师的这个系列的“水仙花数”的博客系统地阐述了各种技巧的LOGO编程求解水仙花数,后面还介绍了理论上可以花1900年甚至更多的时间才能求解1-15位自幂数的LOGO编程。最大的水仙花数有39位。十进制自然数中的所有水仙花数共有88个。所以玩“水仙花数”编程是一个非常好的学习项目。
用3重循环求解水仙花数是最基础、最直观的LOGO编程方式。源程序如下:
to sxh_a
for[b 1
9][
;循环产生百位数
for[s 0
9][ ;循环产生十位数
for[g 0 9][
;循环产生个位数
make "h
:b*:b*:b+:s*:s*:s+:g*:g*:g ;求各位数的乘方和
make "sw
:b*100+:s*10+:g
;计算3位数的值
if :h=:sw[pr
:sw]]]] ;如果相等,就是找到了水仙花数
end
程序运行的结果证明只有4个3位的水仙花数。
下面介绍这种编程方式的知识点:
1. for[b 1 9][for[s 0
9][for[g 0 9][循环体]]]用3重循环来产生百b、十s、个g这3
个数位是非常直接自然的。其中“百”位必须从1循环到9,如果也从0循环到9,那么当百位的值是0时,“3位数”就变成了2位数了。循环时是优先从内嵌套的循环先计算,然后再从外一层的循环来继续计算。
2. 计算3次乘方用:b*:b*:b乘法的计算速度是优于求幂power 3 :b的。所以优先采用:b*:b*:b。可能有人会认为都使用计算机了,还怕速度慢吗?但是前面我们已经说过全部计算1~15位的自幂数需要1900年!从这样的角度考虑,在程序的每一个细节上都精打细算,尽量提高计算速度是不是非常重要?!如果不是特殊需要,尽量不要使用power命令。从小养成编程的优良的思维习惯,长大了编写出来的程序都是非常优美精炼的。
其它技巧的编程待续
MSWLogo-FMSLogo编写出来的动画程序
加载中,请稍候......