ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何用VBA作ABC+DEF=XYZ趣味数学题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-4-2 20:24 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如题,并见附图及附件:
xyz.gif
电子表附件:
ABC+DEF=XYZ.rar (7.62 KB, 下载次数: 35)

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-3 15:51 | 显示全部楼层
楼上的附件xls文件在下是用“硬”办法做出来的,期待高手帮忙用VBA简单的办法搞定。

“硬”办法是:因为电子表只有65536行,而9!=362880>65536,所以先作8!=40320(即先作不含数字9的8位数的全排列),然后根据ABC+DEF=XYZ的特点ABCDEFXYZ中A、D不可能为9,即在做好的8位数第2、3、5、6、7、8、9位分别插入数字9再组成7×40320=282240个9位数分7个sheet表装入数据,再在这7个表格中将数据每相邻3个作为一组分为三列(用mid函数),用if函数判断三列ABC+DEF=XYZ是否成立并作记号,按记号筛选合乎要求的行,将7个工作表合乎要求的数据行复制到一个新的工作表内,再用if函数判断ABC<DEF,经过筛选、升序排列最终得到结果。

如此操作费时又费力,苦不堪言!故诚请高手出手相助!!

附8位数全排列并写表的程序:
Sub PL_jiu()
For i1 = 1 To 8
PL1 = "12345678"
a1 = Mid(PL1, i1, 1)
    For i2 = 1 To 7
    PL2 = Mid(PL1, 1, i1 - 1) & Mid(PL1, i1 + 1, 8 - i1)
    a2 = Mid(PL2, i2, 1)
        For i3 = 1 To 6
        PL3 = Mid(PL2, 1, i2 - 1) & Mid(PL2, i2 + 1, 7 - i2)
        a3 = Mid(PL3, i3, 1)
            For i4 = 1 To 5
            PL4 = Mid(PL3, 1, i3 - 1) & Mid(PL3, i3 + 1, 6 - i3)
            a4 = Mid(PL4, i4, 1)
                For i5 = 1 To 4
                PL5 = Mid(PL4, 1, i4 - 1) & Mid(PL4, i4 + 1, 5 - i4)
                a5 = Mid(PL5, i5, 1)
                    For i6 = 1 To 3
                    PL6 = Mid(PL5, 1, i5 - 1) & Mid(PL5, i5 + 1, 4 - i5)
                    a6 = Mid(PL6, i6, 1)
                        For i7 = 1 To 2
                        PL7 = Mid(PL6, 1, i6 - 1) & Mid(PL6, i6 + 1, 3 - i6)
                        a7 = Mid(PL7, i7, 1)
                            For i8 = 1 To 1
                            PL8 = Mid(PL7, 1, i7 - 1) & Mid(PL7, i7 + 1, 2 - i7)
                            a8 = PL8
                            i = i + 1
                            code = a1 & a2 & a3 & a4 & a5 & a6 & a7 & a8
                            Sheet1.Cells(i, 1) = code
                            Next i8
                        Next i7
                    Next i6
                Next i5
            Next i4
        Next i3
    Next i2
Next i1
End Sub

[ 本帖最后由 yimin0519 于 2011-4-3 16:04 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-4-8 20:58 | 显示全部楼层
研究了几天,终于搞出来,算是练练脑。办法可能不是最佳,但可能是最容易看明白。 解趣题.rar (9.43 KB, 下载次数: 40)

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-9 17:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-4-9 21:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

  1. Sub yy()
  2. Dim arr(1 To 1000, 0), i&, j&, k&, s$, n&
  3. For i = 123 To 987 \ 2
  4. For j = i + 1 To 987 - i
  5. s = i & "+" & j & "=" & i + j
  6. If InStr(s, "0") = 0 Then
  7. For k = 1 To 9
  8. If InStr(s, k) = 0 Then Exit For
  9. Next
  10. If k = 10 Then
  11. n = n + 1
  12. arr(n, 0) = s
  13. End If
  14. End If
  15. Next j, i
  16. [a1].Resize(n) = arr
  17. MsgBox "n=" & n
  18. End Sub
复制代码

[ 本帖最后由 northwolves 于 2011-4-9 21:48 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-4-9 22:11 | 显示全部楼层
事实上,由于a+b=c ,a+b+c=2c,故c 是9的倍数,代码可进一步优化:

  1. Sub yy()
  2. Dim arr(1 To 1000, 2), a&, b&, c&, k&, s$, n&, t!
  3. t = Timer
  4. For a = 123 To 987 \ 2
  5. For b = a + 14 To 987 - a
  6. c = a + b
  7. If c Mod 9 = 0 Then
  8. s = a & b & c
  9. If InStr(s, "0") = 0 Then
  10. For k = 1 To 9
  11. If InStr(s, k) = 0 Then Exit For
  12. Next
  13. If k = 10 Then
  14. n = n + 1
  15. arr(n, 0) = a
  16. arr(n, 1) = b
  17. arr(n, 2) = c
  18. End If
  19. End If
  20. End If
  21. Next b, a
  22. [a1].Resize(n, 3) = arr
  23. MsgBox "n=" & n & "t=" & Timer - t
  24. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-10 03:01 | 显示全部楼层
My God,这代码的运算速度!怎的了得!!谢谢狼斑竹的帮助。

在下不会编程,只会简单使用VBA程序,先囫囵吞个枣。以后再慢慢消化代码的意思了。

本人太菜了点,思前想后,还是烦请狼斑竹解释一下主要代码段的意思,先行谢过!
  1. Sub yy()
  2. Dim arr(1 To 1000, 2), a&, b&, c&, k&, s$, n&, t!
  3. t = Timer
  4. For a = 123 To 987 \ 2               '①“\ 2”的意思是?
  5. For b = a + 14 To 987 - a            '②“+ 14”的数学含义?
  6. c = a + b
  7. If c Mod 9 = 0 Then
  8. s = a & b & c
  9. If InStr(s, "0") = 0 Then            '③“InStr()”函数在此循环中表达的意思?
  10. For k = 1 To 9
  11. If InStr(s, k) = 0 Then Exit For     '④ 同 ③
  12. Next                                 '⑤ 这个For...Next的作用?
  13. If k = 10 Then                       '⑥ “k=10”继何而来?
  14. n = n + 1
  15. arr(n, 0) = a
  16. arr(n, 1) = b
  17. arr(n, 2) = c
  18. End If
  19. End If
  20. End If
  21. Next b, a
  22. [a1].Resize(n, 3) = arr
  23. MsgBox "n=" & n & "t=" & Timer - t
  24. End Sub
复制代码

[ 本帖最后由 yimin0519 于 2011-4-10 04:24 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-4-10 13:26 | 显示全部楼层

  1. Sub yy()
  2. Dim arr(1 To 1000, 2), a&, b&, c&, k&, s$, n&, t!
  3. t = Timer
  4. For a = 123 To 987 \ 2               '①“\ 2”的意思是:除以2取整,a+b<987,a<987\2
  5. For b = a + 14 To 987 - a            '②“+ 14”的数学含义?y12-x98>=14
  6. c = a + b
  7. If c Mod 9 = 0 Then
  8. s = a & b & c
  9. If InStr(s, "0") = 0 Then            '③“InStr()”函数在此循环中表达的意思?s中出现0才继续判断,否则直接跳过
  10. For k = 1 To 9
  11. If InStr(s, k) = 0 Then Exit For     '④ 同 ③,1-9有一个没出现在S中就不再继续判断
  12. Next                                 '⑤ 这个For...Next的作用?
  13. If k = 10 Then                       '⑥ “k=10”继何而来?1-9都在S中出现了,此时K=10
  14. n = n + 1
  15. arr(n, 0) = a
  16. arr(n, 1) = b
  17. arr(n, 2) = c
  18. End If
  19. End If
  20. End If
  21. Next b, a
  22. [a1].Resize(n, 3) = arr
  23. MsgBox "n=" & n & "t=" & Timer - t
  24. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-4-10 20:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
狼斑竹出手,本人受益良多,学习了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-10 22:32 | 显示全部楼层
原帖由 northwolves 于 2011-4-10 13:26 发表

Sub yy()
Dim arr(1 To 1000, 2), a&, b&, c&, k&, s$, n&, t!
t = Timer
For a = 123 To 987 \ 2               '①“\ 2”的意思是:除以2取整,a+b



For k = 1 To 9
If InStr(s, k) = 0 Then Exit For
Next
If k = 10 Then
n = n + 1
这个法子太绝了!!我还以为要用到什么正则表达式之类什么的。

感谢狼斑竹忙里偷闲,热忱解答。

[ 本帖最后由 yimin0519 于 2011-4-10 22:47 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-26 17:31 , Processed in 0.041873 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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