|
楼主 |
发表于 2012-9-22 08:37
|
显示全部楼层
本帖最后由 hjj0451 于 2012-9-22 17:25 编辑
思路解析:
本题主要有2种方法:
--------------------------------------------------------------------
法一:间接相加判断剔除法
如除7、10楼外的其他各楼层。
---------------------------------------------------------------------
0-9都加上{0;10;20;30},再用逻辑判断或TEXT剔除不需要的(0+0及{4,5,9}+30),用SMALL取出。下面主要分析作为SMALL第1参数的部分,别的比较简单。在此基础上的A2:G2为第一权重,列号为第2权重,以按原数据大小顺序依次取出,这里不分析,属于基础知识。
A2:G2都加上{0;10;20;30},得到4行7列的数组,不许要的0+0只能出现在数组第一行,{4,5,9}+30只能出现在数组第4行,判断剔除。
以原数据第1行为例,用公式=IF(A2:G2="",999,IF((A2:G2+{0;1;1;1})*((A2:G2<4)+{1;1;1;0}),A2:G2*101+{0;10;20;30},999))得到下面的4行7列数组,各列对应+{0;10;20;30},一目了然:
其中最后一列是空单元格容错,其余对应原始数据的0(G40)、4(E43、H43)、5(D43)、9(C43)、2楼CHOOSE({1;2;3;4},A2:G2=0,,,A2:G2>3)+(A2:G2=""))只是上面的变形:
4楼的TEXT({1;2;3;4}&$A2:$G2,"[<11]9999;[<44]00;9999"):
5楼的=A2:G2*0.10001+COLUMN(A:G)%+(MOD({1;2;3;4}&A2:G2,44)<11)+{0;1;2;3}%%:
MOD({1;2;3;4}&A2:G2,44)<11比较妙,一下就排除了所有不需要的信息。
13楼的TEXT((A2:G2<"")*(A2:G2+{0;10;20;30}),"[>33]9E+5;[=]9E+5"):
17楼的TEXT({5;6;7;8}&A2:G2,"[<51]e;[<84];e"):
利用的是日期序列5、6、7、8、50、84、85、86、87、88、89的年份(1900)。
关于MOD(LARGE(-(A2:G2&COLUMN(A:G)&TEXT({5;6;7;8}&A2:G2,"[<51]e;[<84];e")),COLUMN()-8),-50):
举例,假设一个负的四位数为-19ab,相当于-1900-ab,-1900必能被-50整除,MOD为0。Mod(-ab,-50)=mod(100-ab,50)-50。TEXT赋值为1900的,如-51900、-461900的可被-50整除,MOD为0,TEXT设置显示为空。
--------------------------------------------------------------------
法二:直接列举剔除法:
如7楼、10楼,利用ROW(1:33),不容易看出来,容易受思维习惯影响而采用法一。
----------------------------------------------------------------------
以7楼头版的公式为例解析一下:
首先看看ROW(1:33)的数字规律:这33个数可分解为,1-3加了{0;10;20;30},0加了{10;20;30},4-9加了{0;10;20}。与题目要求取的数量(为0则加10、20、30,1-3时则分别加0、10、20、30;4-9则分别加0、10、20)完全一致,利用它直接就达到效果。这是思路核心。
先看看第一个公式的核心部分,=IF(RIGHT(ROW($1:$33))-10*(A2:G2="")-A2:G2,1,A2:G2%+COLUMN(A:G)%%+ROW($1:$33)%%%)
这是1个33行7列的由1和按权重组合成的必要信息组成的数组,不满足需要的返回1,后面的步骤MID取出"",满足条件的返回A2:G2%+COLUMN(A:G)%%+ROW($1:$33)%%%,赋予权重用MID取数。
分析下IF条件:RIGHT(ROW($1:$33))-10*(A2:G2="")-A2:G2:
当A2:G2="",IF条件判断结果<0,返回1;
当A2:G2=0,如上玫瑰红色对应的部分(也就是row(1:33)的10、20、30)才为0,否则返回1;
当A2:G2=1-3,如上黄色对应的部分(也就是row(1:33)的1-3、11-13、21-23、31-33)才为0,否则返回1;
当A2:G2=4-9亦然,只有A2:G2与ROW(1:33)的尾数相同时,我们才需要结果,否则返回1。
10\20\30计算中丢掉了末尾的0,最后补0,=MID(SMALL(上面的结果,COLUMN()-8)&0,7,2)
条件进一步简化为RIGHT(ROW($1:$33))+10-(1&A2:G2),A2:G2为空返回正数,其余与上面相同,得到第2个公式。
上面的公式结构为if(a-b,1,y),可把其简化为y^(a=b),同时把y提取了一个%到外面,%计算优先顺序先于^,(A2:G2+COLUMN(A:G)%+ROW($1:$33)%%)%^((1&A2:G2)-RIGHT(ROW($1:$33))=10),得到第3个公式。
公式还可以缩短6字符到93字符,SMALL第一参数写为(A2:G2&COLUMN(A:G)+ROW($1:$33)%)%^(A2:G2&""=RIGHT(ROW($1:$33))),如果A2:G2是文本格式,&""还可以去掉,90字符。
10楼公式原理基本相同,不同在加权取数上。
---------------------------------------------------------------------------
以上就是对本题两种思路的简要分析。
此题属于技巧性题目,不象上一题有个值得借鉴和推广使用的方法论。利用ROW(1:33)这个思路不容易想到,人常常受制于思维定式,容易被提问的方式和字眼迷惑,顺着提问方式走,这时来个脑筋急转弯就显出智慧。7楼和17楼解决问题的过程中体现的小技巧值得学习,都是函数达人。
如还有完全不同的思路可跟贴 。
|
评分
-
1
查看全部评分
-
|