ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 数论

[求助] 求助简单测试数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-1-25 19:02 | 显示全部楼层
数论 发表于 2023-1-25 18:30
测试好像没有问题,请陆离老师介绍一下您的算法,让我学习一下,谢谢。

把数字按每一位的数字排序,然后字典去重,再把去重以后的数字去算次方和,再放字典里,如果和存在了就是有

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-1-25 19:05 | 显示全部楼层
陆离Lowry 发表于 2023-1-25 19:02
把数字按每一位的数字排序,然后字典去重,再把去重以后的数字去算次方和,再放字典里,如果和存在了就是 ...

只判断有和没有还是不难,要把数据和和列出来就要循环好几次的感觉

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-1-25 23:32 | 显示全部楼层
大概试了下,没检查,看其他老师的代码互相验证吧。

显示有1万多个不重复的7位数,并且对应的7次方和没有重复的。
  1. Sub test7()
  2.     t = Timer
  3.     Dim d As Object, d1 As Object
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set d1 = CreateObject("scripting.dictionary")
  6.     For i = 1000000 To 9999999
  7.         s = sortNum(i)
  8.         If Not d.exists(s) Then
  9.             d(s) = m
  10.             m = Sqr7(s)
  11.             If d1.exists(m) Then
  12.                 Debug.Print "it's the same", d1(m), s
  13.                 Exit For
  14.             Else
  15.                 d1(m) = s
  16.             End If
  17.         End If
  18.     Next
  19.     MsgBox Timer - t & "_" & d.Count
  20.     Set d = Nothing
  21.     Set d1 = Nothing
  22. End Sub
  23. Function sortNum(x)
  24.     Dim ar(9) As String, k
  25.     k = Len(x)
  26.     For i = 1 To k
  27.         s = Mid(x, i, 1)
  28.         ar(s) = ar(s) & s
  29.     Next
  30.     sortNum = Join(ar, "")
  31. End Function
  32. Function Sqr7(x)
  33.     For i = 1 To Len(x)
  34.         Sqr7 = Sqr7 + Mid(x, i, 1) ^ 7
  35.     Next
  36. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2023-1-26 11:39 | 显示全部楼层

关于去重:
      123和321以及231都是一样的结果,纯暴力搜索会多次计算重复结果,可以用带重复元素的组合的递归算法来去重多余的计算,可很大的提高运行效率,当位数达到9位,指数为7时,也就是从100000000到999999999时,算7次方,如果纯暴力搜索,估计花时会很长,但用组合只要2秒多可得到10组符合要求的结果。
测试如下,仅供参考:
1.gif

     




Test.7z

1.47 MB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2023-1-26 20:07 | 显示全部楼层
挺有意思的一题目,对于幂的计算虽然不知道是否有其他方法,但对于VBA的写法还是有很多可以发掘的地方,刚刚测试发现为什么同样位数的数的7次方比6次方计算慢了好多倍,原以为是计算幂的问题,想想也不至于差这么多,突然想起来还是之前讨论过的一个字典加入元素的效率问题(大概的意思就是key如果是大数(数值型),转换为字符串,效率会提升很大),竟然忘了,更新一下,同样的数据,上面的9位数7次方的计算可从2.3秒提升到0.39秒,同时删除sum参数的类型,效率下降可忽略,但可支持更多位数数字的计算,避免溢出。

Test.7z

18.95 KB, 下载次数: 3

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-1-26 20:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wodewan 发表于 2023-1-26 20:07
挺有意思的一题目,对于幂的计算虽然不知道是否有其他方法,但对于VBA的写法还是有很多可以发掘的地方,刚 ...

可以弄个数组保存0-10的7次方结果,用到x7次方时直接用arr(x)。细节上也可以再优化下,比如0和1的7次方也是0和1,但增加了判断,不知道速度是提升还是变慢

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-1-27 11:12 | 显示全部楼层
leolee82 发表于 2023-1-26 20:25
可以弄个数组保存0-10的7次方结果,用到x7次方时直接用arr(x)。细节上也可以再优化下,比如0和1的7次方也 ...

嗯,对,这个我也试过,效率上几乎没什么差别,就没改,貌似各种语言对单纯数值运算的效率都很高。

TA的精华主题

TA的得分主题

发表于 2023-1-27 13:55 | 显示全部楼层
主題在:兩個無序有重覆的長數字, 如何比對其相同或相異???
因為不想先排序數字,
直接用公式去分拆^次方再以其和值比對, 問題是..究竟要用"幾次方"...才能百分百不發生誤判???

所以才用VBA來驗證~~
其實這個方法, 不管用幾次方, 總是心裡沒個底~~

TA的精华主题

TA的得分主题

发表于 2023-1-27 15:01 | 显示全部楼层
准提部林 发表于 2023-1-27 13:55
主題在:兩個無序有重覆的長數字, 如何比對其相同或相異???
因為不想先排序數字,
直接用公式去分拆^次方再 ...

被老师说糊涂了,又看了一遍题目,没提到.究竟要用"幾次方"...,不是固定的几次方吗?(例如题目中的7次方,不固定怎么算?)也没什么用公式分拆,而是给定一个区间,比如4位数1000-9999,看是否存在2个不同组合而不是排列,是否其N次方的和结果相同。

TA的精华主题

TA的得分主题

发表于 2023-1-27 15:37 | 显示全部楼层
wodewan 发表于 2023-1-27 15:01
被老师说糊涂了,又看了一遍题目,没提到.究竟要用"幾次方"...,不是固定的几次方吗?(例如题目中的7次 ...

7次方只是其中一個方案, 也許是8或9次方,
是想測試兩個"長得"不一樣數字串中的個別數字分別^?次方後, 再加總,
會不會產生相同的加總數, 但其實兩個數字串(排序後)却不一樣???

樓主是使用了一個數組公式, 用來比較兩個區不同位置數字是否相同?
那公式用了次方做轉合, 但不確定用7次方是否可以百分百正確~~
所以來vba將所有數字都驗證一番~~
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 15:39 , Processed in 0.042549 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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