加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2023-06-26 15:25:49)
标签:

林老师

pclogo

mswlogo

fmslogo

c

分类: WinXP~7~8~10运行Logo语言
编程求解1~15位“水仙花”数
编程求解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秒钟

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

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

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






                                              

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有