ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [开_54]牵一发而动全身

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-8-24 17:40 | 显示全部楼层

为了使程序更加具有普遍性和可读性,给出预先不排除所有错误答案的完全穷举法代码供参考:

难点在第9题的判断,和估计的相似,运行时间增加到2.7秒,速度也还是可以了:)

Application.ScreenUpdating = False '关闭屏幕更新 t = Timer '记录开始时间 Dim a1%, a2%, a3%, a4%, a5%, a6%, a7%, a8%, a9%, a10% Dim cc%, i%, j%, t1%, t2%, tc%, t3%, t4%, t5%, t6%, t7%, tt(1 To 5) As Integer '定义循环变量 Dim arr(1 To 10) As Integer '定义答案数组a=1,b=2,c=3,d=4,e=5 cc = 0 For a1 = 1 To 5 '第1题 arr(1) = a1 For a2 = 1 To 5 '第2题 arr(2) = a2 For a3 = 1 To 5 '第3题 arr(3) = a3 For a4 = 1 To 5 '第4题 arr(4) = a4 For a5 = 1 To 5 '第5题 arr(5) = a5 For a6 = 1 To 5 '第6题 arr(6) = a6 For a7 = 1 To 5 '第7题 arr(7) = a7 For a8 = 1 To 5 '第8题 arr(8) = a8 For a9 = 1 To 5 '第9题 arr(9) = a9 For a10 = 1 To 5 arr(10) = a10 '第10题 If arr(arr(1) + 1) <> 2 Then GoTo xxx '题1条件 If arr(arr(2) + 1) <> arr(arr(2) + 2) Then GoTo xxx '题2条件 Select Case arr(3) Case 1 t1 = 1 Case 2 t2 = 2 Case 3 t1 = 4 Case 4 t1 = 7 Case 5 t1 = 6 End Select If arr(3) <> arr(t1) Then GoTo xxx '题3条件1 t2 = 0 If arr(3) = arr(1) Then t2 = t2 + 1 If arr(3) = arr(2) Then t2 = t2 + 1 If arr(3) = arr(4) Then t2 = t2 + 1 If arr(3) = arr(7) Then t2 = t2 + 1 If arr(3) = arr(6) Then t2 = t2 + 1 If t2 > 1 Then GoTo xxx '题3条件2,需满足唯一性 t3 = 0 For i = 1 To 10 If arr(i) = 1 Then t3 = t3 + 1 Next i If arr(4) - 1 <> t3 Then GoTo xxx '题4条件 If arr(5) <> arr(11 - arr(5)) Then GoTo xxx '题5条件1 tc = 0 For i = 6 To 10 If arr(5) = arr(i) Then tc = tc + 1 Next i If tc > 1 Then GoTo xxx '题5条件2,需满足唯一性 t4 = 0: t5 = 0 For i = 1 To 10 If arr(i) = 1 Then t4 = t4 + 1 If arr(i) = arr(6) + 1 Then t5 = t5 + 1 Next i If arr(6) < 5 And t4 = t5 Then GoTo linea '题6条件 If arr(6) = 5 And t4 = 1 Then GoTo linea '题6条件,注意选5时需考虑1,2,3,4均不满足 If arr(6) = 5 And t4 > 5 Then GoTo linea '题6条件,注意选5时需考虑1,2,3,4均不满足 GoTo xxx linea: If Abs(arr(7) - arr(8)) <> 5 - arr(7) Then GoTo xxx '题7条件 t6 = 0 For i = 1 To 10 If arr(i) = 5 Then t6 = t6 + 1 Next i If t4 + t6 <> arr(8) + 1 Then GoTo xxx '题8条件 If 9 - arr(8) = 5 Or 9 - arr(8) = 10 Then If arr(9) = 5 Then GoTo kkk ElseIf 9 - arr(8) = 1 Or 9 - arr(8) = 8 Then If arr(9) = 4 Then GoTo kkk ElseIf 9 - arr(8) = 1 Or 9 - arr(8) = 4 Or 9 - arr(8) = 9 Then If arr(9) = 3 Then GoTo kkk ElseIf 9 - arr(8) = 1 Or 9 - arr(8) = 2 Or 9 - arr(8) = 6 Then If arr(9) = 2 Then GoTo kkk ElseIf 9 - arr(8) = 1 Or 9 - arr(8) = 2 Or 9 - arr(8) = 3 Or 9 - arr(8) = 5 Or 9 - arr(8) = 7 Then If arr(9) = 1 Then GoTo kkk End If GoTo xxx '题9条件,比较复杂,难点在需满足:(注:如果同时满足几个条件,按e、d、c、b、a优先次序选择答案),因此要倒着判断,另需注意满足条件的先后性 kkk: cc = cc + 1 For i = 1 To 10 Cells(i, cc) = arr(i) Next i xxx: Next a10 Next a9 Next a8 Next a7 Next a6 Next a5 Next a4 Next a3 Next a2 Next a1 MsgBox "搜索完毕,共找到" & cc & "组解,用时" & Timer - t & "秒"

cY6N1ixV.rar (10.64 KB, 下载次数: 54)
[此贴子已经被作者于2005-8-24 17:54:59编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-25 09:33 | 显示全部楼层

其实第9题的优先,是为了确定选项唯一正确。结合第8题,可知,第9题的结果在(8、7、6、5、4)中,其中5既是质数又是5的倍数。

穷举法又称为“枚举法”或“试凑法”,将所有可能答案一一检查是否符合条件,一般采用循环来实现。

此题的关键是:

1.用数组或变量;千万不能受规划求解的假象迷惑,用单元格来存放枚举出的可能答案并检查。否则运算的时间不是用秒做为单位,而有可能用小时来计了。

2.排除法;尽管此题随着推理的不断深入,完全可能通过逻辑运算推理得到结果,不用枚举。但若要判断此题无解,枚举法是验证的最简单的方法。要减少运算时间,增加约束的条件,是途径之一。具体可参见1楼附件中的相关论述

3.检查是否符合条件;10道题中,前9题均有严格的要求。对这9个要求检查的代码要严格,遗漏任何一点,都有可能导致无解或错误解。

当然,此题可以在有严密的推理基础上,减少循环嵌套的层数,从而减少运算量。有兴趣的朋友可以尝试一下。

[此贴子已经被作者于2005-8-25 9:37:56编辑过]

TA的精华主题

TA的得分主题

发表于 2005-8-26 14:35 | 显示全部楼层

这样纯文字性的东西,你们竟然能写成代码,佩服.

至于规划求解,我已经想破了,你们请吧.

[em06]是想破脑袋了.

TA的精华主题

TA的得分主题

发表于 2005-8-26 14:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

其实本题就难在要将文字性的东西转换成计算机看得懂的命令。

再就是要求准确、全面,并且尽量减少运算量。

规划求解我也试过多次,均不能成功。不是做不出来,而是规划求解好像在处理整数和含复杂函数单元格时经常会报错或找不到答案,我也没法。干脆编程解决,好在还是很快的。

TA的精华主题

TA的得分主题

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

我10楼的代码还能优化,把简单的判断置前,复杂的判断置后,速度还能提高:

Application.ScreenUpdating = False '关闭屏幕更新 t = Timer '记录开始时间 Dim a1%, a2%, a3%, a4%, a5%, a6%, a7%, a8%, a9%, a10% Dim cc%, i%, t1%, t2%, tc%, t3%, t4%, t5%, t6%, t7% '定义循环变量 Dim arr(1 To 10) As Integer '定义答案数组a=1,b=2,c=3,d=4,e=5 cc = 0 For a1 = 1 To 5 '第1题,不为2 If a1 = 2 Then GoTo line1 arr(1) = a1 For a2 = 2 To 5 '第2题,不为1 arr(2) = a2 For a3 = 1 To 5 '第3题,不为2 If a3 = 2 Then GoTo line2 arr(3) = a3 For a4 = 2 To 5 '第4题,不为1 arr(4) = a4 For a5 = 1 To 5 '第5题 arr(5) = a5 For a6 = 1 To 5 '第6题 arr(6) = a6 For a7 = 1 To 4 '第7题,不为5 arr(7) = a7 For a8 = 1 To 3 '第8题,不为4,5 arr(8) = a8 For a9 = 1 To 4 '第9题 If a9 = 3 Then GoTo line3 '不为3,5 arr(9) = a9 For a10 = 1 To 5 arr(10) = a10 If arr(arr(1) + 1) <> 2 Then GoTo xxx '题1条件 If arr(arr(2) + 1) <> arr(arr(2) + 2) Then GoTo xxx '题2条件 If arr(5) <> arr(11 - arr(5)) Then GoTo xxx '题5条件1 If Abs(arr(7) - arr(8)) <> 5 - arr(7) Then GoTo xxx '题7条件 Select Case arr(3) Case 1 t1 = 1 Case 3 t1 = 4 Case 4 t1 = 7 Case 5 t1 = 6 End Select If arr(3) <> arr(t1) Then GoTo xxx '题3条件1 t3 = 0 For i = 1 To 10 If arr(i) = 1 Then t3 = t3 + 1 Next i If arr(4) - 1 <> t3 Then GoTo xxx '题4条件 tc = 0 For i = 6 To 10 If arr(5) = arr(i) Then tc = tc + 1 Next i If tc > 1 Then GoTo xxx '题5条件2,需满足唯一性 t2 = 0 If arr(3) = arr(1) Then t2 = t2 + 1 If arr(3) = arr(4) Then t2 = t2 + 1 If arr(3) = arr(7) Then t2 = t2 + 1 If arr(3) = arr(6) Then t2 = t2 + 1 If t2 > 1 Then GoTo xxx '题3条件2,需满足唯一性 t4 = 0: t5 = 0 For i = 1 To 10 If arr(i) = 1 Then t4 = t4 + 1 If arr(i) = arr(6) + 1 Then t5 = t5 + 1 Next i If arr(6) < 5 And t4 = t5 Then GoTo linea '题6条件 If arr(6) = 5 And t4 = 1 Then GoTo linea '题6条件,注意选5时需考虑1,2,3,4均不满足 If arr(6) = 5 And t4 > 5 Then GoTo linea '题6条件,注意选5时需考虑1,2,3,4均不满足 GoTo xxx linea: t6 = 0 For i = 1 To 10 If arr(i) = 5 Then t6 = t6 + 1 Next i If t4 + t6 <> arr(8) + 1 Then GoTo xxx '题8条件,简化了题目,排除不可能项 Select Case arr(9) Case 1 t7 = 7 Case 2 t7 = 6 Case 4 t7 = 8 End Select If 9 - arr(8) <> t7 Then GoTo xxx '题9条件 cc = cc + 1 For i = 1 To 10 Cells(i, cc) = arr(i) Next i xxx: Next a10 line3: Next a9 Next a8 Next a7 Next a6 Next a5 Next a4 line2: Next a3 Next a2 line1: Next a1 MsgBox "搜索完毕,共找到" & cc & "组解,用时" & Timer - t & "秒"

运算时间0.33秒,呵呵!是不是有点吹毛求疵?不过严格的要求嘛应该是酱紫滴。

[em05]
[此贴子已经被作者于2005-8-29 8:43:16编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-27 16:00 | 显示全部楼层

强!应该是精益求精。

整型变量比字符变量来得快得多!!

TA的精华主题

TA的得分主题

发表于 2005-8-30 16:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

都是计算机专业的吧

TA的精华主题

TA的得分主题

发表于 2005-8-30 21:43 | 显示全部楼层
没办法了,只能灌水了,先收下了,谢谢各位

TA的精华主题

TA的得分主题

发表于 2005-9-1 13:52 | 显示全部楼层

试了UNARTHUR的程序,简洁,快速,并得到了唯一一组解。

本着学习提高的目的,逐句地学习理解UNARTHUR的程序,并试着用自己想法进行编写。发现第6题前四个答案本就自相矛盾,无法用语言表述,窃以为只能选E。修改了UNARTHUR的程序后,竟出现了两组解。再复查整个程序,觉得UNARTHUR2题条件未完全描述完,没有达到唯一性,才致出现两组解。

终,对UNARTHUR程序修改后结果如下。

FduX9uu2.rar (10.92 KB, 下载次数: 38)

还有,

1、 根据楼主附件意见,区分了得到解与全部循环完毕的用时。

2、 根据有人直接推算得到答案的情况,本人以为:以有严密的推理基础,减少循环嵌套的层数,减少运算量,没有意义(直接把答案写出如何)。至于第6题的简化,是因为程序无法编写。

UNARTHUR程序中第六题各答案个数的统计:

For i = 1 To 10

If arr(i) = 1 Then t4 = t4 + 1

If arr(i) = arr(6) + 1 Then t5 = t5 + 1

Next i

但是,在分别统计CDE个数的时候,因为本身答案是bcd,与统计差了一级,因此前一轮统计个数就少了一个,统计就有错误,而且这个错误是无法纠正的。

[此贴子已经被作者于2005-9-2 11:15:02编辑过]

CNEU17ml.rar

10.76 KB, 下载次数: 29

[VBA3]牵一发而动全身

TA的精华主题

TA的得分主题

发表于 2005-9-2 09:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

首先谢谢cxjsjt朋友的赞扬和关注,仔细阅读了您的评论,感觉您在整个程序的理解上还是存在偏差。

先说您修改后的程序,附件代码运行结果第二题答案为e,这很显然是错误的,因为6,7题的答案不同,原因是您的循环设计有问题,请看其中这段代码:

For a2 = 1 To 5 '第2题 arr(2) = a2 arr(arr(2) + 1) = arr(arr(2) + 2) Then t3 = t3 + 1 Next a2 If t3 <> 1 Then GoTo xxx '题2条件

这个for循环走完arr(2)肯定是5(即e),而对本身第2题的条件根本没有加以判断,而答案e又正好满足了除第二题以外其他所有题的条件,所以程序走完后会出现您的这组错误答案。

另外 " If t3 <> 1 Then GoTo xxx '题2条件" 这个判断条件是没有必要的,因为它是用来证明题目本身的正确性(或者说严谨性的)。我们的目的是要解答问题而不是证明题目的正确性,如果题目本身就有问题那是根本没法解的。

最后说一下您提到的第6题的情况。您的表述我看了好多遍才看懂,呵呵!不得不说您在这里存在一个理解上的误区。什么叫穷句法?实际上就是枚举所有答案的组合(正确的和不正确的共5^10组),然后再对每个组合进行多条件判断,全部满足的拿出来作为一组解。也就是在进行每一个判断时假定的一组解已经存在了。所以不会出现象您所说的无法判断和难以表达的情况。题目本身表述都是很清晰的,所以编程思路也是比较清晰的。

您的一些其他意见还是很好的。

[此贴子已经被作者于2005-9-2 9:55:25编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 14:29 , Processed in 0.049577 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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