ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 函数与公式] [72期]哪些灯亮着?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-4-12 16:06 | 显示全部楼层
1、每一盏灯都会被1号拨过
2、除1号灯外所有的灯还会被自己拨过
MOD(SUM((MOD(ROW(),ROW($1:$256))=0)*1),2)可以判断当前灯是否亮
首先所有的质数都会灭掉
合数中除了两个因数相同的情况下灯也会灭掉
故最简公式为
a2=IF(ROW()-1>256^0.5,"",(ROW()-1)^2)

包含思路的公式就是
a2=TEXT(SMALL(IF(ROW($1:$256)^0.5=INT(ROW($1:$256)^0.5),ROW($1:$256),999),ROW()-1),"[>256]""""")
含等号94字节

[ 本帖最后由 leecg 于 2011-4-12 16:25 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-4-13 09:12 | 显示全部楼层
=IF(MOD(SUM(--(ROW(1:1)=ROW($1:$256)*COLUMN($1:$1))),2),ROW(1:1),"")

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2011-4-13 21:17 | 显示全部楼层
第一次答题:

只能到108个
=TEXT(SMALL(IF(ISODD(FREQUENCY(ROW($1:$256)*COLUMN(1:1),ROW($1:$256))),ROW($1:$256),9^9),ROW(A1)),"[<257];")

[ 本帖最后由 xinzijin2006 于 2011-4-15 13:30 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-4-15 15:58 | 显示全部楼层

哪些灯还亮着 的答卷

哪些灯还亮着 的答卷
IF(MOD(FREQUENCY((MOD(ROW($A2)-1,ROW($A$2:A2)-1)),0),2)<>0,ROW()-1,"") 公式拖动

[ 本帖最后由 shaoshan 于 2011-4-15 16:03 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2011-4-15 16:02 | 显示全部楼层
数学解法~嘻嘻!!
IF(MOD(SQRT(ROW()-1),1)=0,ROW()-1,"")
公式拖动

[ 本帖最后由 shaoshan 于 2011-4-15 16:04 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2011-4-18 08:02 | 显示全部楼层

回复 59楼 fangjianp 的帖子

帖子没开放,看不见
猜测内容:
答题截止,以下答题无分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-18 01:00 | 显示全部楼层
说明:
本题来自于组合数学的一道题目(小学生是解不了的)。
只要模拟几次开关过程,便可以得出最终那些亮着灯的编号,这些编号相当具有规律:即
为不大于256的平方数,所以若在非竞赛的情况下,大家完全可以把平方数填上。
稍加分析,也可以发现,当265个人走过后,只有那些被开关过奇数次的灯最终是亮的,
有人用穷举方法,也证明了所有不大于256的平方数即为所求,也有些参赛者马上就意识
到这个问题归根结底是求一个数(包括自身和1)的因子个数,于是他们经过上述分析后
迅速得出结论,所有的平方数有奇数个因子。其实数论书中有定理:
“正整数n的因子个数(n=1,2,3,……)是奇数个的充要条件:n是一个完全平
方数,因子个数是偶数个的充要条件是n是一个非完全平方数”
相当一部分参赛者就把下面的公式作为了:
B2=TEXT(ROW(A1)^2,"[>256] "),然后下拉,交卷。
对于这样的或与此类似的,我都通过短信的方式向他们重述了题目的要求
本竞赛题的要求是:所有参赛者须将你在得出答数为平方数前的分析用EXCEL函数语言
表达出来,这在这道题目贴出后两天就加上了附加如下要求:
注意:解答公式必须能体现解题思路
以上是关于这题要求的说明,大多数参赛者是明白的。
解题思路:
已知
第一个人拨动了1,2,……,256盏的开关:1,2,3,4,5,6,7,8,9,10,11,12, …
第二个人拨动了2,4,6,……盏灯的开关:      2,   4,   6,   8,   10,     12,  …
第三个人拨动了3,6,9,……盏灯的开关:         3,      6,      9,          12,  …
                 ……………………………………
用EXCEL语言表达:
第一个人拨动了:  (MOD(ROW(1:256),1)=0)=TRUE
第二个人拨动了:  (MOD(ROW(1:256),2)=0)=TRUE
第三个人拨动了:  (MOD(ROW(1:256),3)=0)=TRUE
                 ……………………………………
第二五六人拨动了:(MOD(ROW(1:256),256)=0)=TRUE
将这结果对应位置相加,即有:
              MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0)
其结果为:{1;2;2;3;2;4;2;4;3;4;2;6;2;4;4;5;2;6;2;6;4;4;2;8;3;4;4;6;2;8;2;6;4;4;4;9;2;4;4;8;2;8;2;6;6;4;2;10;3;6;4;6;2;8;4;8;4;4;2;12;……
从这串数中可见,排在平方数位置上的数为奇数,其余皆为偶数
很自然用MOD()函数去判别其奇偶性
       MOD(MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0),2)     <1>
若为0的是偶数,为1的是奇数,其结果如下
     {1;0;0;1;0;0;0;0;1;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;……
所有平方数位置上的是1,其余是0
以后的步骤就简单了,常规方法是:
=--TEXT(MOD(MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0),2)*ROW(1:156),"0;;999")
其结果为:
{1;999;999;4;999;999;999;999;9;999;999;999;999;999;999;16;999;999;999;999;999;999;999;999;25;999;999;999;999;999;999;999;999;999;999;36;999;……

将其由小到大排序,(根据答题区域,可知只需取前29个数
=SMALL(--TEXT(MOD(MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0),2)*ROW(1:256),"0;;999"),ROW(1:29))
上式等于:
{1;4;9;16;25;36;49;64;81;100;121;144;169;196;225;256;999;999;999;999;999;999;999;999;999;999;999;999;999}
最后用TEXT(……,"[=999] ")便解决问题了。
但是这样处理的结果是公式长度为121,不符合题目要求。
相当一部分参赛者就是没有将公式很好地简化,最后功亏一篑,未能满足题目要求,可惜了!
简化:
回到<1>式:
我们知道,确认一个数K的奇偶性有几种方法
   ISODD(K),MOD(K,2),-1^K
上述三法中显然-1^K最简
我们将<1>式改为:-1^MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0)
上式等于:
{-1;1;1;-1;1;1;1;1;-1;1;1;1;1;1;1;-1;1;1;1;1;1;1;1;1;-1;1;1;1;1;1;1;1;1;1;1;-1;1;1;1;1;1;1;1;1;1;1;1;1;-1;1;1;1;1;1;1;……
平方数位置上为-1,其余为1
如果现在将其由小到大排序,前面16个数为-1,后续全是1,但这就缺少了灯的编号信息
因此在排序前,还应将灯的编号信息附加上去,较简洁的方法如下:
=-1^MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0)/ROW(1:256)
有些意外,一般都是乘以ROW(1:256),这儿却是除以ROW(1:256),但无论如何,这还是带上了等编号的信息
由小到大排序,取前29项,
=SMALL(-1^MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0)/ROW(1:256),ROW(1:29))
按F9可见其结果为
{-1;-0.25;-0.111111111111111;-0.0625;-0.04;-0.0277777777777778;-0.0204081632653061;-0.015625;-0.0123456790123457;-0.01;-0.00826446280991736;-0.00694444444444444;-0.00591715976331361;-0.00510204081632653;-0.00444444444444444;-0.00390625;0.00392156862745098;0.00393700787401575;0.00395256916996047;0.00396825396825397;0.00398406374501992;0.004;0.00401606425702811;0.00403225806451613;0.00404858299595142;0.0040650406504065;0.00408163265306122;0.00409836065573771;0.00411522633744856}
然后再求其倒数
=1/SMALL(-1^MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0)/ROW(1:256),ROW(1:29))
得到结果为
{-1;-4;-9;-16;-25;-36;-49;-64;-81;-100;-121;-144;-169;-196;-225;-256;255;254;253;252;251;250;249;248;247;246;245;244;243}
再用TEXT()函数:TEXT(……,";0")就得到正果了(多单元格数组公式)
=TEXT(1/SMALL(-1^MMULT(-(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0)/ROW(1:256),ROW()-1),";0")
简化后公式长度为95
这是一种解法,参赛者中,22楼willin2000版主给出了这个,和我贴在10楼的公式仅一字之差
模拟256个人分别经过拨动开关还有一种更巧妙的方法,这里写上,
                                   FREQUENCY(ROW(1:256)*COLUMN(1:1),ROW(1:256))
具体解释可参见wangg913版主在本期竞赛13楼可找到,此处不再赘述。
由这一方法可得最简公式为:
=TEXT(1/SMALL(-1^FREQUENCY(ROW(1:256)*COLUMN(1:1),ROW(1:256))/ROW(1:257),ROW()-1),";0;")
长度88
2楼,3楼,7楼等也用了此法,只是在简化上没有进一步优化使公式最优。

最后的叙述:
本题要得到正确的答数是非常容易的,参赛者中绝大部分都是知道的。但欲将分析用函数语言
完整表达出来,可能因为答数太过易得,相当一些人反而不知怎样用函数语言表达了,真有些“知其然不知其所以然”
本题第二个难点是在简化上面,willin2000版主功力深厚,在化简方面做到了最优。
相当一部分参赛者在没有很好地优化,结果公式超出了规定长度,不能得分,可惜了了!
明天将对各位参赛者提交的评审。
最后感谢大家参与,第一次出竞赛题,可能考虑不周,望大家指正!再次谢谢各位E友了!!!

[ 本帖最后由 fangjianp 于 2011-4-18 01:25 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-4-18 08:15 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-4-18 12:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 63楼 yvhgydn 的帖子

1^1:1更短,但不提倡,如果这些单元格中有其他文字信息则会出错。

TA的精华主题

TA的得分主题

发表于 2011-4-16 19:00 | 显示全部楼层
多单元格数组公式:=TEXT(SMALL(IF(MOD(MMULT(N(MOD(ROW(1:256),COLUMN(1:1))=0),ROW(1:256)^0),2),ROW(1:256),257),ROW(1:256)),"[<257]0;")

取巧:=TEXT(ROW(A1)^2,"[<257]0;")
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 19:56 , Processed in 0.050243 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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