Excel精英培训网

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

[VBA] 用VBA或者数学解决此难题

[复制链接]
发表于 2017-1-3 23:34 | 显示全部楼层 |阅读模式
用VBA或者数学解决此难题


将0、1、2、3、4、5、6、7、8、9十个数字,组成三个三位数、一个一位数,并且使这四个数之和为999,

我们要求最大的三位数尽可能大,则这个最大的三位数____________________


excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2017-1-4 08:34 | 显示全部楼层
最大值为649 有12组解:

105+237+8+649
105+238+7+649
107+235+8+649
107+238+5+649
108+235+7+649
108+237+5+649
135+207+8+649
135+208+7+649
137+205+8+649
137+208+5+649
138+205+7+649
138+207+5+649

评分

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

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-1-4 08:44 | 显示全部楼层
香川群子 发表于 2017-1-4 08:34
最大值为649 有12组解:

105+237+8+649

不懂结果如何来,需要过程
回复

使用道具 举报

发表于 2017-1-4 10:47 | 显示全部楼层
按数理逻辑推算,小学生都能做到。

1. 3位数的百位取1、2最小,所以最大3位数的百位=9-(1+2)=6

2. 剩余数中十位取0、3最小,所以最大3位数的十位=9-(0+3)=6还要减去个位的进位。

3. 个位4个数从剩余的4、5、7、8、9这5个数中取值,
   那么个位和范围最小=4+5+7+8=24 到 最大=5+7+8+9=29,所以进位必须是=2
   那么,最大3位数的十位=9-(0+3)-2=4

4. 最大3位数的个位从剩余4个数5、7、8、9中取最大的=9

因此,这个最大3位数必须是=649

5. 其它3个数中,百位1或2、十位0或3、个位5或7或8任意组合,
   一共有=2*2*3=12种组合变化。


以上

如果编程暴力解,那么可以分3层循环来做。

评分

参与人数 3 +32 金币 +20 收起 理由
laoau138 + 3 来学习
苏子龙 + 9 神马都是浮云
望帝春心 + 20 + 20 来学习!

查看全部评分

回复

使用道具 举报

发表于 2017-1-4 11:12 | 显示全部楼层
逻辑基础决定思维的上层建筑
回复

使用道具 举报

 楼主| 发表于 2017-1-4 13:48 | 显示全部楼层
香川群子 发表于 2017-1-4 10:47
按数理逻辑推算,小学生都能做到。

1. 3位数的百位取1、2最小,所以最大3位数的百位=9-(1+2)=6

如何暴力破解
回复

使用道具 举报

 楼主| 发表于 2017-1-4 13:49 | 显示全部楼层
香川群子 发表于 2017-1-4 10:47
按数理逻辑推算,小学生都能做到。

1. 3位数的百位取1、2最小,所以最大3位数的百位=9-(1+2)=6

原来小学水平也没有   
回复

使用道具 举报

发表于 2017-1-4 14:25 | 显示全部楼层
  1. Sub 暴力破解()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     For i = 100 To 139
  4.         For j = 200 To 239
  5.             For k = 4 To 9
  6.                 a = 999 - i - j - k
  7.                 If ISOK(i & j & k & a) Then d(a) = d(a) & "," & i & "+" & j & "+" & k & "=999"
  8.             Next
  9.         Next
  10.     Next
  11.     dk = d.keys
  12.     xrr = Split(d(dk(0)), ",")    '因为i,j,k都在逐步增大,所以只取第一个即可
  13.     For i = 1 To UBound(xrr)
  14.         Cells(i, 1) = dk(0) & "+" & xrr(i)
  15.     Next
  16. End Sub

  17. Function ISOK(x) As Boolean   '判断x是否0-9全包含
  18.     Dim arr%(0 To 9)
  19.     For i = 1 To Len(x)
  20.         arr(Mid(x, i, 1)) = 1
  21.     Next
  22.     For i = 0 To 9
  23.         s = s + arr(i)
  24.     Next
  25.     If s = 10 Then ISOK = True
  26. End Function
复制代码

评分

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

查看全部评分

回复

使用道具 举报

发表于 2017-1-4 15:31 | 显示全部楼层
暴力破解算法,供对比:

  1. Sub test()
  2.     Dim i&, j&, k&, n&, r&, s$, t&
  3.     For i = 103 To 198 '第1个3位数 i 首位=1
  4.         For j = 203 To 298 '第2个3位数 j 首位=2
  5.             For k = 3 To 9    '剩下的1位数 k
  6.                 t = 999 - i - j - k '计算第3个3位数
  7.                 If t > j Then   '保证比第2个3位数大时
  8.                     s = i & j & k & t '合并4个数组成字符串
  9.                     If Chk(s) Then '检查该字符串没有重复数字(即能包含0-9且不重复)
  10.                         n = n + 1: Cells(n, 1) = t: Cells(n, 2) = i & "+" & j & "+" & k & "+" & t '输出结果
  11.                         If t > r Then r = t '记录最大值
  12.                     End If
  13.                 End If
  14.             Next k, j, i
  15.     [a1].Resize(n, 2).Sort [a1], 2 '结果倒排序
  16.     MsgBox r
  17. End Sub
  18. Function Chk(s$) As Boolean
  19.     Dim i&, t$
  20.     For i = 1 To 9
  21.         t = Mid(s, i, 1): If InStr(i + 1, s, t) Then Exit Function
  22.     Next
  23.     Chk = True
  24. End Function
复制代码

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 06:43 , Processed in 0.268350 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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