ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [开_102]一道趣味算术题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-4-28 16:23 | 显示全部楼层
好有意思的題目,但這問題對我最難的地方是要如何找出階乘的全部排列結果(這個是關鍵)
先秀一下我的結果,全結果如附件文檔myAns.rar
myans.jpg 只列出最主要的程式碼,附件test.rar有全部的程式碼
  1. '初始化
  2. '
  3. Private Sub ini_ex()
  4. '階乘陣列最小的N設為1
  5. LowestStartNo = 1
  6. '階乘陣列最小的N的排列的結果為LowestFactorial
  7. ReDim LowestFactorial(1, 1)
  8. LowestFactorial(1, 1) = 1

  9. End Sub
复制代码
  1. '1 2 3 ...N 取得所有的排列組合,將結果輸出至result
  2. 'Parameters:
  3. 'N - 就是上述的N
  4. 'Result()  -將結果放到這個變數
  5.     '這是二維陣列
  6.     'for example
  7.     '1 2 3的所有排列組合是 (123) (132) (213)(231)....
  8.     '那Result的存法就是
  9.     '(1,1)=(123)的1
  10.     '(1,2)=(123)的2
  11.     '(1,3)=(123)的3
  12.     '(2,1)=(132)的1
  13.     '(2,2)=(132)的3
  14.     '以此類推....
  15. 'HasLastFactorial - 布林值。是否有之前的排列結果。若要找N=5的所有排列組合,如果有N=4的排列組合的資料,將會運算快一些
  16. 'LastNo - 如果HasLastFactorial為真,有之前的排列結果,那之前排列結果的N即為LastNo,如果HasLastFactorial為假,這個值就沒有意義,可隨便亂填@@
  17. 'LastFactorial()  - 如果HasLastFactorial為真,這個就是有之前的排列結果,如果HasLastFactorial為假,這個值就沒有意義,可隨便亂填@@
  18. 'Returns:
  19. '如果有找1~N的排列組合,則為真,否則為假

  20. Private Function getFactorial(N As Integer, ByRef Result() As Integer, HasLastFactorial As Boolean, LastNo As Integer, LastFactorial() As Integer) As Boolean
复制代码
  1. '以2個1 之間有1個數,2個2 之間有2個數,2個3之間有3個數...為原則,找出由(1,1,2,2,3,3,4,4,5,5,6,6,..N,N) 2*N(N<=8) 個數組成的字符串滿足上述條件的所有組合,將結果輸出到result() as string

  2. 'Parameters:
  3. 'N - 就上述的N
  4. 'Factorial - 1 2 3 ...N的所有排列組合,是二維陣列(第一維是
  5.     'for example
  6.     '1 2 3的所有排列組合是 (123) (132) (213)(231)....
  7.     '那Factorial的存法就是
  8.     '(1,1)=(123)的1
  9.     '(1,2)=(123)的2
  10.     '(1,3)=(123)的3
  11.     '(2,1)=(132)的1
  12.     '以此類推....
  13. 'Result() - 將答案放到這個string

  14. 'Returns:
  15. '如果有答案,則為真,否則為否
  16. Private Function FindAns(N As Integer, Factorial() As Integer, ByRef Result() As String) As Boolean
复制代码
  1. '開始找答案
  2. Sub FunQuestiong()
  3. Call ini_ex
  4. Dim noData() As Integer
  5. Dim f1() As Integer
  6. Dim f2() As Integer
  7. Dim f3() As Integer
  8. Dim f4() As Integer
  9. Dim f5() As Integer
  10. Dim f6() As Integer
  11. Dim f7() As Integer
  12. Dim f8() As Integer
  13. Dim f9() As Integer
  14. Dim f10() As Integer


  15. Dim Ans1()  As String
  16. Dim Ans2() As String
  17. Dim Ans3() As String
  18. Dim Ans4() As String
  19. Dim Ans5() As String
  20. Dim Ans6() As String
  21. Dim Ans7() As String
  22. Dim Ans8() As String
  23. Dim Ans9() As String
  24. Dim Ans10() As String

  25. 'N=1
  26. If getFactorial(1, f1(), False, 0, noData) = True Then
  27.    
  28.     If FindAns(1, f1, Ans1) Then
  29.         Call ShowAns(1, Ans1)
  30.     Else
  31.         Call ShowNoAns(1)
  32.     End If
  33. End If

  34. 'N=2
  35. If getFactorial(2, f2(), True, 1, f1) = True Then
  36.    
  37.     If FindAns(2, f2, Ans2) Then
  38.         Call ShowAns(2, Ans2)
  39.     Else
  40.         Call ShowNoAns(2)
  41.     End If
  42. End If
  43. 'N=3
  44. If getFactorial(3, f3(), True, 2, f2) = True Then
  45.    
  46.     If FindAns(3, f3, Ans3) Then
  47.         Call ShowAns(3, Ans3)
  48.     Else
  49.         Call ShowNoAns(3)
  50.     End If
  51. End If
  52. 'N=4
  53. If getFactorial(4, f4(), True, 3, f3) = True Then
  54.    
  55.     If FindAns(4, f4, Ans4) Then
  56.         Call ShowAns(4, Ans4)
  57.     Else
  58.         Call ShowNoAns(4)
  59.     End If
  60. End If

  61. 'N=5
  62. If getFactorial(5, f5(), True, 4, f4) = True Then
  63.    
  64.     If FindAns(5, f5, Ans5) Then
  65.         Call ShowAns(5, Ans5)
  66.     Else
  67.         Call ShowNoAns(5)
  68.     End If
  69. End If
  70. 'N=6
  71. If getFactorial(6, f6(), True, 5, f5) = True Then
  72.    
  73.     If FindAns(6, f6, Ans6) Then
  74.         Call ShowAns(6, Ans6)
  75.     Else
  76.         Call ShowNoAns(6)
  77.     End If
  78. End If
  79. 'N=7
  80. If getFactorial(7, f7(), True, 6, f6) = True Then
  81.    
  82.     If FindAns(7, f7, Ans7) Then
  83.         Call ShowAns(7, Ans7)
  84.     Else
  85.         Call ShowNoAns(7)
  86.     End If
  87. End If

  88. 'N=8
  89. If getFactorial(8, f8(), True, 7, f7) = True Then
  90.    
  91.     If FindAns(8, f8, Ans8) Then
  92.         Call ShowAns(8, Ans8)
  93.     Else
  94.         Call ShowNoAns(8)
  95.     End If
  96. End If



  97. 'N=9
  98. If getFactorial(9, f9(), True, 8, f8) = True Then
  99.    
  100.     If FindAns(9, f9, Ans9) Then
  101.         Call ShowAns(9, Ans9)
  102.     Else
  103.         Call ShowNoAns(9)
  104.     End If
  105. End If

  106. 'if u have good computer u can try run N=10
  107. ''N=10
  108. 'If getFactorial(10, f10(), True, 9, f9) = True Then
  109. '
  110. '    If FindAns(10, f10, Ans10) Then
  111. '        Call ShowAns(10, Ans10)
  112. '    Else
  113. '        Call ShowNoAns(10)
  114. '    End If
  115. 'End If
  116. Call writeTxt

  117. End Sub
复制代码








test.rar

21.46 KB, 下载次数: 69

myAns.rar

2.26 KB, 下载次数: 65

TA的精华主题

TA的得分主题

发表于 2013-4-30 12:48 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 14:20 , Processed in 0.031356 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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