Excel精英培训网

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

[已解决]VBA如何把21分解为5个整数之和

[复制链接]
发表于 2016-3-29 18:59 | 显示全部楼层 |阅读模式


VBA如何把21分解为5个整数之和

如何把21分解为5个整数之和,同时把分解的5个整数排列在圆周上,

使得沿圆圈相连的若干个(1~5个)整数之和覆盖区间[1,21]中的所有整数




最佳答案
2016-3-31 14:37
已经编程算出来了。满足条件的只有2组。且是镜像的。

1        3        10        2        5
1        5        2        10        3

发表于 2016-3-29 19:13 | 显示全部楼层
  1. 分解的5个整数排列在圆周上
复制代码
这话啥意思?
回复

使用道具 举报

 楼主| 发表于 2016-3-29 21:27 | 显示全部楼层
蝶·舞 发表于 2016-3-29 19:13
这话啥意思?


和为1个整数,共5个
和为2个相连整数,共5个,
和为3个相连整数,共...
后面同理


回复

使用道具 举报

发表于 2016-3-29 22:22 | 显示全部楼层
反正我没搞明白,做了一半
QQ截图20160329220012.jpg
  1. Private Sub UserForm_Initialize()

  2.     Dim a1, i%
  3.     a1 = Array(0.294755174410904, 0.955572805786141, 0.563320058063622, 0.826238774315995, 0.78183148246803, 0.623489801858734, 0.930873748644204, 0.365341024366395, 0.99720379718118, 7.47300935864244E-02, 0.974927912181824, -0.222520933956314, 0.866025403784439, -0.5, 0.680172737770919, -0.733051871829826, 0.433883739117558, -0.900968867902419, 0.149042266176175, -0.988830826225129, -0.149042266176174, -0.988830826225129, -0.433883739117558, -0.900968867902419, -0.680172737770919, -0.733051871829826, -0.866025403784438, -0.5, -0.974927912181824, -0.222520933956314, -0.99720379718118, 7.47300935864244E-02, -0.930873748644204, 0.365341024366395, -0.78183148246803, 0.623489801858733, -0.563320058063622, 0.826238774315995, -0.294755174410905, 0.955572805786141, -2.45029690981724E-16, 1)
  4.     For i = 0 To 41 Step 2
  5.         Me.Controls("Label" & 1 + Int(i / 2)).Caption = Format(Int(i / 2), "00")
  6.         Me.Controls("Label" & 1 + Int(i / 2)).Left = a1(i) * 100 + 120
  7.         Me.Controls("Label" & 1 + Int(i / 2)).Top = a1(i + 1) * 100 + 120
  8.     Next i
  9. '    Shape1.Left = 1000
  10. '    Shape1.Top = 1000
  11. '    Shape1.Height = 6200
  12. '    Shape1.Width = 6200
  13.     Me.Height = 260
  14.     Me.Width = 260

  15. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-3-30 10:08 | 显示全部楼层
wp8680 发表于 2016-3-29 22:22
反正我没搞明白,做了一半

哪里不明白
回复

使用道具 举报

发表于 2016-3-30 10:47 | 显示全部楼层
本帖最后由 香川群子 于 2016-3-30 11:02 编辑

这个最简单了。

1、2、4、8、16……这样的2倍数序列,可以完整覆盖[1,31]区域内的所有整数。

对于[1,21]区间来说,这样的组合就会有很多了。
如:1、2、4、8、[6-16都可以]

具体计算一下,5个数总和=21的有10组:
+11+4+3+2+1……满足
+10+5+3+2+1……满足
+9+6+3+2+1……满足
+9+5+4+2+1……满足
+8+7+3+2+1……满足
+8+6+4+2+1……满足
+8+5+4+3+1……缺2、19
+7+6+5+2+1……缺4、17
+7+6+4+3+1……缺2、19
+7+5+4+3+2……缺1、20

其中只有前6组满足覆盖[1,21]区间所有整数的条件。
回复

使用道具 举报

 楼主| 发表于 2016-3-30 12:33 | 显示全部楼层
香川群子 发表于 2016-3-30 10:47
这个最简单了。

1、2、4、8、16……这样的2倍数序列,可以完整覆盖[1,31]区域内的所有整数。

你还没有亮出代码来
回复

使用道具 举报

发表于 2016-3-30 13:00 | 显示全部楼层
香川群子 发表于 2016-3-30 10:47
这个最简单了。

1、2、4、8、16……这样的2倍数序列,可以完整覆盖[1,31]区域内的所有整数。

你牛,但是我笨,就是不明白什么叫缺二个数,什么叫覆盖。


回复

使用道具 举报

发表于 2016-3-30 13:07 | 显示全部楼层
wp8680 发表于 2016-3-30 13:00
你牛,但是我笨,就是不明白什么叫缺二个数,什么叫覆盖。

我也是瞎猜的。

可能未必是楼主心里面真正想要的结果。



回复

使用道具 举报

发表于 2016-3-30 13:11 | 显示全部楼层
本帖最后由 香川群子 于 2016-3-30 13:15 编辑
vbyou127 发表于 2016-3-30 12:33
你还没有亮出代码来

如果理解正确,那么做法很简单:

1. 取21选5组合=Combin(21,5)=20349种组合。

2. 每个组合检查=2^5-1=31种全组合。

3. 检查是否覆盖[1-21]集合范围。

以上。


算法可以简化,因为1和2是必须含有的。
所以只需检查=Combin(19,3)=969种组合,得到和=21的有8个组合。
然后检查=2^5-1=31种全组合,是否覆盖[1-21]集合范围。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 08:07 , Processed in 0.473083 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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