一下子编辑20多个贴,手都麻了, 终于明白为什么版主们出的题越来越难了, 原来... 呵呵,开个玩笑. 本题来自于实际工作中解决某一问题的需要,所以做了个数据模型来作题,但看来我的数据模型做的不是很好,使得答案不需要用到三维运算就能达到目的了,看到大家精彩的答案,感觉真是无心插柳柳成荫. 看竞赛题答案的主要感受是,不仅是看大家如何使公式最短,而且还要看公式之间的细微差别,正是那些差别体现了方法的不同, 这些方法可能对当时的题目来说是有优劣的,但所谓"劣"的方法,有可能在解决其他问题时更好或必须使用这种方法,所以应该也学习掌握所涉及到的其他方法. 本题的答案基本上可以归纳为三类(全部是数组公式): 第一类: 将列合并为一个字符串,然后计算"111"字符串的个数.如2楼wddn的: N2=SUM(B2:M2,5-LEN(SUBSTITUTE(10^14+SUM(B2:M2*10^COLUMN(A:L)),"111",))/3) 第二类:,利用FREQUENCY计算出0,1之间的间隔得到连续1的个数,再计算多个3整数倍连续1,如6楼leeyong的: N2=SUM(B2:M2,INT(FREQUENCY(IF(B2:M2,COLUMN(B:M)),COLUMN(B:M)*(1-B2:M2))/3)) 第三类:是算出第三个连续1的位置,然后置该位置值为2,在把所有数据相加,如29楼dj-1621的: =SUM(B23:M23*(1+(MOD(COLUMN(B:M)-LOOKUP(COLUMN(A:L),IF(A23:L23<>1,COLUMN(A:L))),3)=0))) 第一类中用SUM(..,B2:M2)比SUM(...)+SUM(B2:M2)要简洁. COLUMN(B:M)*(1-B2:M2) 来代替IF(B2:M2,,COLUMN(B:M))比较巧妙. 第二类中10^14+的使用使得在长度的计算过程简洁了许多. 第三类通过LOOKUP来计算个数(和COLUMN()-配合)是比较另类的算法. 我原来的答案是: N2=SUM(TRUNC((2+FREQUENCY(IF(COUNTIF(OFFSET(A2,,ROW($1:$10),,3),1)=3,ROW($1:$10)),IF(COUNTIF(OFFSET(A2,,ROW($1:$10),,3),1)=3,,ROW($1:$10))))/3),B2:M2) 由于数据模型没弄好,所以针对本题就没必要用上面的公式了.同时通过本次竞赛发现出题和解题的思路应该有所不同.
[此贴子已经被作者于2007-9-22 17:47:05编辑过] |