ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-8-22 15:41 | 显示全部楼层 |阅读模式

题目内容:

以下10道题的答案互相牵制,请用VBA编写能求解出正确答案的代码。

 1、第一个答案是b的问题是哪一个?   (a)2;   (b)3;   (c)4;   (d)5;   (e)6  2、唯一的连续两个具有相同答案的问题是:   (a)2,3;   (b)3,4;   (c)4,5;   (d)5,6;   (e)6,7;  3、本问题答案和哪一个问题的答案相同?   (a)1;   (b)2;   (c)4;   (d)7;   (e)6  4、答案是a的问题的个数是:   (a)0;   (b)1;   (c)2;   (d)3;   (e)4  5、本问题答案和哪一个问题的答案相同?   (a)10;   (b)9;   (c)8;   (d)7;   (e)6  6、答案是a的问题的个数和答案是什么的问题的个数相同?   (a)b;   (b)c;   (c)d;   (d)e;   (e)以上都不是  7、按照字母顺序,本问题的答案和下一个问题的答案相差几个字母?   (a)4;   (b)3;   (c)2;   (d)1;   (e)0(注:a和b相差一个字母,d和b相差两个字母)  8、答案是元音字母的问题的个数是:   (a)2;   (b)3;   (c)4;   (d)5;   (e)6(注:a和e是元音字母)  9、答案是辅音字母的问题的个数是:   (a)一个质数;   (b)一个阶乘数;   (c)一个平方数;   (d)一个立方数;   (e)5的倍数(注:如果同时满足几个条件,按e、d、c、b、a优先次序选择答案)  10、本问题的答案是:   (a)a;   (b)b;   (c)c;   (d)d;   (e)e

(改编自http://club.excelhome.net/viewthread.php?tid=116948) 答题要求:

 1、解出的答案必须同时满足10个问题的要求,均为单选题。用VBA答题。(用规划求解有创意亦可酌情给分)。  2、必须给出完整的解题过程,在代码中适当标明是如何满足每道小问题要求的。(附答案供参考)  3、代码从开始运算到解出正确答案,运算时间不得超过10分钟。  4、解出的答案依次显示在EXCEL工作表的A1:A10区域内

提示:  1、注意题中唯一、连续等限制条件  2、10以内的 质数:1、2、3、5、7; 阶乘数:1、2、6; 平方数:1、4、9; 立方数:1、8; 5的倍数:5、10  3、本题只有唯一解。c、d、e、b、e、e、d、c、b、a

现将我的解法及部分感受成文打包供各位参考.

PD17Jbbw.rar (198.66 KB, 下载次数: 147)
[此贴子已经被作者于2005-8-24 17:17:55编辑过]
单选投票, 共有 23 人参与投票

距结束还有: 2964 天2 小时34 分钟

您所在的用户组没有投票权限

TA的精华主题

TA的得分主题

发表于 2005-8-22 16:37 | 显示全部楼层

运算时间不得超过10分钟。

CPU ??? MHz Intel ???

Memory ??? M

TA的精华主题

TA的得分主题

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

回2楼

本来也想过要加上这个附加条件。不过相信很少有谁还在用赛杨333了。(我的测试在C333 192M SDRAM WINXP OFFICE2003的环境)。

思路对了,或许不到1分钟就可以了。尽量优化代码来提高速度。10分钟做个限制,只是怕出现那种漫漫长路的程序,让大家等到花儿谢了才出结果。

TA的精华主题

TA的得分主题

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

这种题不准用规划求解是不是有点不人道吖?哈哈!简直是规划求解的教学范例吖

用纯VBA估计海量循环估计电脑要罢工吖,有没有好的优化方法还得想一想

不过题目还是蛮有创意的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-23 12:02 | 显示全部楼层
规划求解也可以啊,放个上来大家可以借鉴一下约束条件。

TA的精华主题

TA的得分主题

发表于 2005-8-23 14:14 | 显示全部楼层
不好意思只能灌管水了,太难了

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-23 17:29 | 显示全部楼层

都说难,多点提示吧:

要提高运算速度,要用数组 要多用排除法

TA的精华主题

TA的得分主题

发表于 2005-8-23 17:31 | 显示全部楼层

优化代码一个主要方法就是减少循环,对于各小题中不可能得到的答案不加入循环中。大家可考虑先从中剔除不可能的答案 暂时对原题分析出不可能的答案为:

1,不可能答案为B=3 如果为B的话,则第一个答案为B的题目应为1,与B的答案3矛盾;

2,不可能答案为A=2,3 如为A,则第3题答案应为1,那么此时第1,2,3题答案皆为A,与第二题矛盾;

3,不可能答案为B=2 如为B则第2题也应为B,那么根据第2题答案,唯一的连续两个相同答案的问题是3,4与结果矛盾(因此时2,3也是连续两个答案相同的问题)

4,不可能答案为A=0 答案A与本题目矛盾

7,不可能答案为E=0 如果为0,那么第8题答案将为6(答案同为E),此时第7题与第8题答案相同,这与第2题条件不符;

8,不可能答案为D,E 第9题排除了5,所以本题不可能为5 排除答案6的原因与7同

9,本题答案可简化为A:7;B:6;C:4;D:8;E:5 不可能答案为C,E 从第8题得知元音字母个数在2-6个范围,得辅音字母个数在4-8范围内 又因答案为唯一,所以E=5排除(5既是质数也是5的倍数) 排除C=4的原因是从第8题中已排除元音字母个数为6个,所以辅音字母个数不为4个

[此贴子已经被作者于2005-8-30 23:15:11编辑过]

TA的精华主题

TA的得分主题

发表于 2005-8-24 15:18 | 显示全部楼层

花了好长时间,终于还是解出来了,用时0.375秒,没想到会这么快吖,哈哈!其实中间也绕了不少弯路,编程思路如下:

1,使用的是穷举法,即循环所有可能选项组合,然后对每一种组合判断是否满足所有条件。

2,循环中根据清风II兄的提示,排除了一些比较明显的错误选择。主要是事前担心循环耗时太多,想尽量减少循环次数以赢得时间,事后想起来其时也没有太大必要,因为所有组合共5^10约1000万种,在乘上每一种大约判断10次的话总循环此数也就是1亿左右,因为都是内存运算,对于现在的计算机来说还是小case了。所以就算完全穷举也不会明显影响速度。

3,有几题除了需满足本身条件外,还需满足唯一性条件,这是需要注意的。

4,昨天我一个同事居然花了一个中午的时间就给凑出答案来了(no use pc),我狂晕!不过她无法证明唯一性。

附代码和注释,给感兴趣的朋友参考:

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条件 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 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,需满足唯一性 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条件,简化了题目,排除不可能项 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 & "秒"

gHUh0EH3.rar (10.26 KB, 下载次数: 90)

TA的精华主题

TA的得分主题

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

不错.

只是没有把清风排除答案的推理过程写出来.版主可以评分了

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

本版积分规则

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

GMT+8, 2024-11-25 13:07 , Processed in 0.043294 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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