ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 一个小小练习题,求更优解

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-20 12:48 | 显示全部楼层
1.jpg

网上看到的小题,好像论坛竞赛版有个相同的题来着,但是想不起来了,不知道函数有没有解

先学习图表去了,回头抽空再解

TA的精华主题

TA的得分主题

发表于 2019-4-20 13:24 | 显示全部楼层
本帖最后由 江苏永能朱兴华 于 2019-4-20 13:36 编辑

老师玩的题越来越像纯数学题,第一人第一次取数只把第二个人逼到6的整倍数就行,下次取数也一样第二人取数为1,你就为5加为6就行。=MATCH(,MOD(100-{1,2,3,4,5},6),)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-20 15:30 | 显示全部楼层
江苏永能朱兴华 发表于 2019-4-20 13:24
老师玩的题越来越像纯数学题,第一人第一次取数只把第二个人逼到6的整倍数就行,下次取数也一样第二人取数 ...

哇,是这个意思,你这厉害了,我是好早以前竞赛那边还是哪看到过类似的问题,今天网上瞎逛又看到顺便贴在这,

这个贴主要记录一些给自己的练习题。实在是周末没意思

TA的精华主题

TA的得分主题

发表于 2019-4-22 17:22 | 显示全部楼层
micch 发表于 2019-4-20 11:56
周末好无聊啊,从VBA版看到个小题,用函数来解一下,看看老师们有没有更优解

将任意两个除数的位置交换,比如2和3,你的公式的结果还对吗?
83159是仅有的满足条件的五位数,也是满足这个条件最小的数。其实这道题更适合手动计算,函数、VBA都是牛刀了,但练手无妨。

TA的精华主题

TA的得分主题

发表于 2019-4-22 17:30 | 显示全部楼层
micch 发表于 2019-4-18 10:38
想一晚上也是最终还是分步完成,这真不是函数干的活。不过分步的话,相当于做辅助了,就灵活多了。

花 ...

把5月16日改成9月18日,你的公式能得出6月18日的结果吗?
软件可以分成,程序和数据。数据很重要,如果不比程序重要的话,那就跟程序一样重要。

首要的目的是解决问题,然后再考虑能否用一个公式,或者接着继续把一个公式减到最短。




评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-22 18:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 micch 于 2019-4-22 18:50 编辑
anonym 发表于 2019-4-22 17:30
把5月16日改成9月18日,你的公式能得出6月18日的结果吗?
软件可以分成,程序和数据。数据很重要,如果 ...

呃,这是个逻辑问题,后来我也放弃了,函数不适合解题,用函数就要分步辅助去排除,因为规则是分了两步的,第一步是排除唯一的“日”,然后排除的结果里,再提取唯一的“日”,提取的唯一“日”对应的月再提取唯一“月”

符合这个逻辑才能得到结果。5-16改9-18,就不符合逻辑了,结果也不是6-18.而是没有结果。第一步。排除唯一“日”对应的月,所以得到月份可能是6,8,9月。c列公式能得到结果。
第二步,剩下的“日”之中,提取单一“日”,就只剩下14,15了,17和18被排除了。而14和15对应的都是8月,不是唯一月。

大致做一下,不在公式上费劲了,这应该是代码程序的活。分了4步完成。主要的逻辑是:1,排除唯一日,M列公式;2,提取唯一日对应月,N列公式;3,提取唯一生日,O列
1.jpg


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-22 20:40 | 显示全部楼层
本帖最后由 micch 于 2019-4-22 20:45 编辑
anonym 发表于 2019-4-22 17:22
将任意两个除数的位置交换,比如2和3,你的公式的结果还对吗?
83159是仅有的满足条件的五位数,也是满 ...
  1. =MAX((COUNTIF(2:2,MOD(LCM(A2:K2)*ROW(1:9)-1,L2)+1)=0)*LCM(A2:K2)*ROW(1:9))-1
复制代码
  1. =MIN(IF(COUNTIF(2:2,MOD(LCM(A2:K2)*ROW(1:9)-1,L2)+1)=0,LCM(A2:K2)*ROW(1:9)))-1
复制代码


呃,就是练着玩,主要是动动脑。
公式都忘了,重写了一下。和顺序无关,不过还真不知道结果是唯一的,那max函数就不行了,得min函数

TA的精华主题

TA的得分主题

发表于 2019-4-23 12:05 | 显示全部楼层
micch 发表于 2019-4-22 20:40
呃,就是练着玩,主要是动动脑。
公式都忘了,重写了一下。和顺序无关,不过还真不知道结果是唯一的 ...

先谈这道余数问题。

我问的数据错序设置是针对你81个字符的公式,不是这两个,虽然你没有写出来,但我随意揣度了一个,我知道这个习惯不好。没有问题自然是最好的。

首先,你的MAX和MIN是一个意思。只是MAX时,是83160>0;MIN时,是83160<FALSE。

其次,你的公式其实就是手动计算的思路,只是还不彻底。
1. LCM(A2:K2)
人工手动计算一定是简化到LCM(G2:K2)的。
2. ROW(1:9)
这个不太合理。要么ROW(1:3),因为大了就超出五位数了;要么ROW(1:13),构成完全剩余系。

人工手动计算的直译公式,应该是,

{=LCM(G2:K2)*MATCH(1,--(MOD(LCM(G2:K2)*ROW(1:3),13)=12),)-1}

似乎比你的更短,其实我是很少看公式长短的,至少是优先级很低。竞赛版为什么求最短公式,因为要量化(高考也是如此)。凡是都有利有弊,虽然有的事情是利大于弊,但我们要知道这个利在哪里,弊在哪里,否则就是无头苍蝇。要站得更高一点看问题。在地上和在井里,虽然看到的井口是一般大小,但看到的天不一样大。

最后,我们再尝试站得更高一点。
1. 既然是电脑自动计算,当然要穷举。不是说人工手动计算没用到穷举,人工手动计算用到的是部分的穷举,先缩小范围,再穷举个ROW(1:3),减少计算量啊。计算是电脑的强项,自然要在更大范围内穷举。

2. 人工手动计算只是计算一道题,电脑自动计算应该要计算一类题。所以数据应该是灵活的,可修改的,不是hard code的。我前面提到数据很重要,不是随便说说的。(包括之前的“授之以渔而渔”,不是随意抱怨,装腔作势,无病呻吟。我发在竞赛版而没有在函数版,不是要博眼球,也不是要博取你们的共鸣、认可和赞同。而是想发给有能力给“渔民”做“渔具”的高手看,非广大“渔民”,因为这些话不适合他们。他们只管用你们做的“渔具”就好了,而“渔具”做得好不好,关键在你们。合适的话要写给合适的对象看。看来还是徒劳了!)

言归正传,我写的电脑自动计算的公式,

=MATCH(12,MMULT(--(MOD(ROW(1:99999),A2:L2)=COLUMN(A:L)*ROW(1:99999)^0-1),ROW(1:12)^0),)

当然更一般化的公式,

=MATCH(COLUMNS(A2:L2),MMULT(--(MOD(ROW(1:99999),A2:L2)=COLUMN(A2:L2)*ROW(1:99999)^0-1),ROW(INDIRECT("1:"&COLUMNS(A2:L2)))^0),)

可以不囿于五位数,不囿于这12个固定除数,可以错序,看你什么要求,用在哪个场合。公式长短不是一定的,是可以变的,不应该成为羁绊。

当然,我知道你是无聊时随便玩玩,认真地写,不是这个样子。而我是认真看帖,认真回帖,花了不少时间的。但愿不是找错了对象,发错了帖子,蹉跎了岁月。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-4-23 20:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
micch 发表于 2019-4-22 18:01
呃,这是个逻辑问题,后来我也放弃了,函数不适合解题,用函数就要分步辅助去排除,因为规则是分了两步的 ...

再谈这道猜生日的逻辑问题。

小米说:我不知道小兰的生日,但我知道小面也不会知道。
请注意前半句话,也就是根据已知,它的意思是,第一步需要过滤掉唯一的月份,虽然根据当前的数据,没有唯一的月份,可以继续第二步,即后半句,过滤掉唯一的日子。然后,继续后面的逻辑,这里不再赘述。

你漏掉了容易忽视的第一步,如果把5月16日改成9月18日,第一步就需要过滤掉9月(9月18日),第二步只会过滤掉16日,19日(7月16日,5月19日),第三步根据第二步继而过滤掉剩下所有的5月(5月15日)和7月(7月14日),第四步(小面已知道答案)则可以判断出答案只可能是唯一的14日(8月14日),15日(8月15日),18日(6月18日),第五步(小米也知道答案了)在上面3个答案里只有6月是唯一的,那么答案只可能是6月18日。

猜生日还有一种情况,题干更精简点,就是两个人只轮流回答“知道”或者“不知道”(谁先回答,结果也会略有不同)。一开始两人都回答不知道(当然存在一开始就回答知道的可能,但这样就简单了)。若干轮次后,有一个人回答知道了,紧接着另一方也回答知道了。轮次数是相关于题目的复杂度的,轮次越多相对越复杂,当然轮次越多,需要的样本数也会相应越多。

类似的猜测逻辑题,还有猜帽子颜色,猜两个数(略复杂些,将两数的和与积分别告诉两个人)等等。数学上的解题思路是类似的,分步讨论,分步排除。

说到函数解这类题,确实不太适合,但不是不可以做,有点繁琐,需要耐心仔细。思路跟数学解法相同,分步讨论过滤。如果硬要求一个公式,就把分步结果代入合并。我做了个结果,代入得到的一个公式大概是4000字符左右,感觉是还可以抵消简化的,但似乎有点复杂,就不在此皇皇巨篇了。

总之还是那句话,第一要务是解决问题,不要让“一个公式”成为陷阱,如同不要让“最短公式”成为羁绊。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-23 21:33 | 显示全部楼层
本帖最后由 micch 于 2019-4-23 22:27 编辑
anonym 发表于 2019-4-23 12:05
先谈这道余数问题。

我问的数据错序设置是针对你81个字符的公式,不是这两个,虽然你没有写出来,但我 ...

嗯,这个所有数字穷举厉害,就不用考虑规律,而是暴力测试,无论给出的条件是什么只要存在答案就能得到结果。
我原来用的是sum+row(1:4),和max,min都是一个意思,完全是根据已知规律来写公式,失去了电脑解题的意义。
我原来的思路就是:任意数字-1,求余再加1,就是除数本身。公倍数直接求前面的数字求余都是0,那么-1的余数就是源数字-1.所以都不相同,所以大致写一个row范围,表示所有公倍数,然后-1,求后一个数的余数,如果不是源数据中的任意一个,就是countif结果为0,那就肯定是所求的数。

我以为是可能有多个,所以才说是求任意结果。却不知道5位数是唯一值。其实就是练习mod函数取自身为结果的意思。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 15:09 , Processed in 0.049760 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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