Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5551|回复: 17

[已解决]用VBA一维动态数组计算水仙花数

[复制链接]
发表于 2017-4-4 22:19 | 显示全部楼层 |阅读模式
本帖最后由 laoau138 于 2017-4-5 16:33 编辑

用VBA一维动态数组计算水仙花数
最佳答案
2017-4-5 15:12
laoau138 发表于 2017-4-5 11:10
第一: 题目要计算3至8位,你这个只能计算3位

第二:计算速度太慢    如果要计算7或8位      如何在几秒 ...

代码如下:
  1. Sub mysel()
  2. Dim x, y, m, n, ar()
  3. For x = 100 To 99999999
  4.    For y = 1 To Len(x)
  5.      m = m + Mid(x, y, 1) ^ Len(x)
  6.    Next
  7.    If m = x Then
  8.     n = n + 1
  9.     ReDim Preserve ar(1 To n)
  10.     ar(n) = x
  11.     m = 0
  12.    Else
  13.     m = 0
  14.    End If
  15. Next x
  16. Range("a1").Resize(n, 1) = Application.WorksheetFunction.Transpose(ar)
  17. End Sub
复制代码


用VBA一维动态数组计算水仙花数.png

用VBA一维动态数组计算水仙花数.rar

6.49 KB, 下载次数: 12

发表于 2017-4-5 10:50 | 显示全部楼层
  1. Sub aaa()
  2. Dim n&, i&, j&, m&, r&, arr
  3. ReDim arr(1 To 1)
  4. n = InputBox("请输入数字位数")
  5. For i = 1 To 10 ^ n - 1
  6.   For j = 1 To Len(CStr(i))
  7.     m = m + Mid(i, j, 1) ^ 3
  8.   Next j
  9.   If m = i Then
  10.     r = r + 1
  11.     ReDim Preserve arr(1 To r)
  12.     arr(r) = i
  13.   End If
  14.   m = 0
  15. Next i
  16. [a1].Resize(r) = Application.Transpose(arr)
  17. End Sub
复制代码

评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-4-5 11:10 | 显示全部楼层

第一: 题目要计算3至8位,你这个只能计算3位

第二:计算速度太慢    如果要计算7或8位      如何在几秒内搞定


回复

使用道具 举报

发表于 2017-4-5 14:53 | 显示全部楼层
本帖最后由 金樽空对月 于 2017-4-5 14:54 编辑
laoau138 发表于 2017-4-5 11:10
第一: 题目要计算3至8位,你这个只能计算3位

第二:计算速度太慢    如果要计算7或8位      如何在几秒 ...

8位数,要判断上千万的数据量,你觉得用EXCEL来运算几秒钟完成,现实吗?
回复

使用道具 举报

发表于 2017-4-5 15:12 | 显示全部楼层    本楼为最佳答案   
laoau138 发表于 2017-4-5 11:10
第一: 题目要计算3至8位,你这个只能计算3位

第二:计算速度太慢    如果要计算7或8位      如何在几秒 ...

代码如下:
  1. Sub mysel()
  2. Dim x, y, m, n, ar()
  3. For x = 100 To 99999999
  4.    For y = 1 To Len(x)
  5.      m = m + Mid(x, y, 1) ^ Len(x)
  6.    Next
  7.    If m = x Then
  8.     n = n + 1
  9.     ReDim Preserve ar(1 To n)
  10.     ar(n) = x
  11.     m = 0
  12.    Else
  13.     m = 0
  14.    End If
  15. Next x
  16. Range("a1").Resize(n, 1) = Application.WorksheetFunction.Transpose(ar)
  17. End Sub
复制代码


评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

发表于 2017-4-5 15:14 | 显示全部楼层
laoau138 发表于 2017-4-5 11:10
第一: 题目要计算3至8位,你这个只能计算3位

第二:计算速度太慢    如果要计算7或8位      如何在几秒 ...

下面是最后的运算结果,用16分钟找到的:
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315
24678050
24678051
88593477

评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

发表于 2017-4-5 15:15 | 显示全部楼层
哦,是我没看仔细,以为都是3次幂。

评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

发表于 2017-4-5 15:15 | 显示全部楼层
laoau138 发表于 2017-4-5 11:10
第一: 题目要计算3至8位,你这个只能计算3位

第二:计算速度太慢    如果要计算7或8位      如何在几秒 ...

一次找出来之后,将这些数据保存,今后可以直接用这些符合条件的数据了。

评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-4-6 08:19 | 显示全部楼层
回复

使用道具 举报

发表于 2017-4-8 13:29 | 显示全部楼层
金樽空对月 发表于 2017-4-5 15:14
下面是最后的运算结果,用16分钟找到的:

你也许不会相信,找到3-8位的这18个自幂数,用我的递归代码只需0.25秒。

算法是关键。

407
740
371
731
370
730
153
531
9474
9744
8208
8820
1634
6431
93084
98430
92727
97722
54748
87544
548834
885443
9926315
9965321
9800817
9887100
4210818
8842110
1741725
7754211
88593477
98877543
24678051
87654210
24678050
87654200


上表是输出结果,A列是满足条件的自幂数、B列是递归检查数的状态(你足够聪明的话就可以发现算法的奥妙)

哈哈。

评分

参与人数 1 +9 收起 理由
laoau138 + 9 来学习

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-28 05:08 , Processed in 0.405541 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表