ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 一道二年级数学:填数字

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-5 22:49 | 显示全部楼层
本帖最后由 aoe1981 于 2018-6-5 22:50 编辑

  如果是5条边,每边3个空位,每边数字和是1400时,结果是唯一的:


100-900-400-800-200-700-500-600-300-1000100-900-400-800-200-700-500-600-300-1000
100-1000-300-600-500-700-200-800-400-900
200-700-500-600-300-1000-100-900-400-800
200-800-400-900-100-1000-300-600-500-700
300-600-500-700-200-800-400-900-100-1000
300-1000-100-900-400-800-200-700-500-600
400-800-200-700-500-600-300-1000-100-900
400-900-100-1000-300-600-500-700-200-800
500-600-300-1000-100-900-400-800-200-700
500-700-200-800-400-900-100-1000-300-600

TA的精华主题

TA的得分主题

发表于 2018-6-6 12:18 | 显示全部楼层
grf1973 发表于 2018-6-5 13:25
用python做了一下,去重及旋转后共15组,不知是否齐全了

你这个代码这么简短。。。。。VBA却需要那么长。。。

TA的精华主题

TA的得分主题

发表于 2018-6-7 10:16 | 显示全部楼层
香川群子 发表于 2018-6-5 21:24
假设a4=5

所以,你的循环可以大大缩小范围:

结果肯定是对的,但分析不一定对吧。代码里abcd是指4个角上的数据,含1的组其“1”不一定在角上。

TA的精华主题

TA的得分主题

发表于 2018-6-7 15:25 | 显示全部楼层
本帖最后由 香川群子 于 2018-6-7 15:33 编辑
grf1973 发表于 2018-6-7 10:16
结果肯定是对的,但分析不一定对吧。代码里abcd是指4个角上的数据,含1的组其“1”不一定在角上。

1必须在端点啊。

假定1不在端点,那么端点a<b<c<d 不含1的最小组合是:2,3,4,5
而12-4-5=3,无法构成满足条件的等式了。

或者考虑 2,3,4,6
而12-4-6=2 也不行

或者考虑 2,3,4,7
而12-4-7=1 可以,
但是接下来7和2或3都无法构成=12的组合。12-7-2=3、12-7-3=2发生冲突。

再往下还有2,3,5,6 和 2,4,5,6 这2种,也都推不下去的。

所以,1只能在端点。

这个排除证明稍微繁琐一点。

而且不是纯理论证明,但是需要排除的组合其实也不算多。

TA的精华主题

TA的得分主题

发表于 2018-6-7 15:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
有理,再分析分析不用编程可以直接硬推了。

TA的精华主题

TA的得分主题

发表于 2018-6-7 16:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个题, 老师如何指导小学生求解? 特别是要求"不同的整百数",是要学生的命呀!

TA的精华主题

TA的得分主题

发表于 2018-6-7 17:00 | 显示全部楼层
我也写了个通用的递归算法代码:

未使用排除法剪枝,但也不是简单的递归遍历。
算法如下:
1. 端点采用遍历的方法。(仅限制为<和值一半)
2. 中间点无需循环遍历,可以直接计算,然后验证是否有效即可(>0以及不重复)

输出结果时,统一转化结果为以1为首字符的字符串。

  1. Dim a&(), b&(), h&, k&, m&, m2&, s$, cnt&
  2. Sub test() 'by kagawa 2018/6/7
  3. '    m = 4 '端点个数m
  4. '    h = 12 '各边总和h
  5.    
  6.     m = 5 '端点个数m
  7.     h = 14 '各边总和h
  8.    
  9.     m2 = m * 2 '数字总数
  10.     ReDim a&(m2), b&(h - 3)
  11.     s = String(m2, "0")
  12.     cnt = 0: Call dg(1)
  13.     Debug.Print cnt '176
  14. End Sub
  15. Sub dg(t&)
  16.     Dim i&, j&, s2$, s3$
  17.     cnt = cnt + 1
  18.    
  19.     If t = m2 + 1 Then
  20.         k = k + 1
  21.         i = InStr(s, 1)
  22.         s2 = Mid(s, i) & Left(s, i - 1) '以1为首位的字符串结果
  23.         s3 = 1 & Left(StrReverse(s2), m2 - 1) '反向然后以1为首位
  24.         If s2 < s3 Then Debug.Print s, s2, s3 Else Debug.Print s, s3, s2
  25.         Exit Sub
  26.     End If
  27.    
  28.     If t <= m Then '端点
  29.         For i = 1 To h / 2 '遍历检查
  30.             If b(i) = 0 Then '如果未重复
  31.                 Mid(s, t * 2 - 1, 1) = i
  32.                 a(t) = i: b(i) = 1
  33.                 Call dg(t + 1)
  34.                 a(t) = 0: b(i) = 0
  35.             End If
  36.         Next
  37.     Else '中间点时 计算得到数值
  38.         If t = m2 Then
  39.             i = h - a(t - m) - a(1)
  40.         Else
  41.             i = h - a(t - m) - a(t - m + 1)
  42.         End If
  43.         If i > 0 Then '如果计算数非负数则有效
  44.             If b(i) = 0 Then '如果未重复
  45.                 If i > 9 Then s2 = Chr(i + 55) Else s2 = i '数值>9时转为字母
  46.                 Mid(s, (t - m) * 2, 1) = s2
  47.                 a(t) = i: b(i) = 1
  48.                 Call dg(t + 1)
  49.                 a(t) = 0: b(i) = 0
  50.             End If
  51.         End If
  52.     End If
  53. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-7 17:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 香川群子 于 2018-6-7 17:08 编辑

用通用递归程序,计算了一下4个端点、总和=14的情形,结果有14组解:

16752849
19482576
18527349
19437258
18563749
19473658
1673482B1B284376
1674392B1B293476
1675293A1A392576
1765392B1B293567
1852743A1A347258
1856392B1B293658
1857293A1A392758
1943752B1B257349
1A34752B1B25743A
1A36572B1B27563A
1A37482B1B28473A

TA的精华主题

TA的得分主题

发表于 2018-6-7 17:13 | 显示全部楼层
aoe1981 发表于 2018-6-4 23:03
  程序的初始参数如下:

我写的递归算法比你简单多了吧。

去重复也不是难事。
以1为首字符,然后反转,得到一组。字典去重复即可。

TA的精华主题

TA的得分主题

发表于 2018-6-7 17:28 | 显示全部楼层
本帖最后由 香川群子 于 2018-6-7 17:45 编辑

加了个字典去除重复:

首字符也不限定=1,而是找到最小的那个数。

多边形总和相同题目的递归计算.zip

23.51 KB, 下载次数: 13

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-12-27 05:23 , Processed in 0.034257 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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