|
首先要声明一下:我认为这是一个特别好的竞赛题目,发到正式竞赛区会得到更多更精妙的思路,虽稍有遗憾但仍应该为楼主的创造性思维喝彩。
这个题目,初次看题时,觉得必须用上面的单元格进行辅助。以D9“5元张数”为例,根据题目要求第四条,即“4、钞票张数应该遵循大额优先原则,
可用一张面额100元的,不允许用两张50元的;”,如果不计算出100元、50元、20元、10元的张数,并从总金额中扣除,是无法计算5元的张数的;
所以总体思路是: 5元张数=取整((金额-SUM({100元;50元;20元;10元}*D$5:D8))/5元)
公式这样实现: D9=INT((D$2-SUM(C5:C8*D5:D8))/C9)
可是遇到最大的麻烦是,C5:C17都是中文,还有可能是空单元格,仅仅用SUM函数是无法取得票面金额序列的;
因此题目的关键是怎样将C5:C17转化为“票面金额”数值,即将 100元;50元;20元;10元;5元;2元;1元;5角;2角;1角;2分;1分
转化为 {100; 50; 20; 10; 5; 2; 1; 0.50; 0.20; 0.10; 0.02; 0.01}
并且公式是从D5开始下拉,D5单元格必定要用到C4和D4进行辅助,因此还要将“面值选择”,“钞票张数”转化为0
这样公式大体的样式变为,D5=INT( D$2 - SUM( 转化C$4:C4为票面数值 * 转化D$4:D4为钞票张数 ) )/ (转化C5为票面金额 100)
下拉至D17时公式变为,D17=INT( D$2 - SUM( 转化C$4:C16为票面数值 * 转化D$4:D16为钞票张数 ) )/ (转化C16为票面金额 0.01)
D列好办,用TEXT进行转换,可轻易将“钞票张数“和空单元格强制转为0,数值不变,TEXT(D$4:D16,"0;;0;!0")
也可用IF判断。 IF(D$4:D16<"",D$4:D16) , 这个公式源于所有数值均小于"",即使 9E+307也小于"",所有文本都大于""
TEXT(D$4:D16,"0;;0;!0") 公式长度 23 TRUE=9E+307<""
IF(D$4:D16<"",D$4:D16) 公式长度 22 TRUE="0">""
使用LEN函数会发现,IF语句更短,所以使用了后者,虽然看起来前者更短。
对于C列文本的数值转换,可发现一个规律,就是将文本的最后一位”圆、角、分"替换掉之后,成为
{"面值选择";100 ; 50 ; 20 ; 10 ; 5 ; 2 ; 1 ; 5 ; 2 ; 1 ; 5 ; 2 ; 1}
这时候可以取巧,将 “元”替换为"00", “角”替换为0, “分”替换为""
这样替换后,就变为:”面值选择“, 10000,5000 , 2000 , 1000 , 500 , 100 , 50 , 20 , 10 , 5 , 2, 1
再用TEXT函数就能得到我所要求的数值了。
经过简化,公式为:
=IF(C5="","",INT((D$2/1%-SUM(TEXT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(C$4:C4,"元",0&0),"角",0),"分",),"0;;;!0")*TEXT(D$4:D4,"0;;0;!0")))/LEFT(C5,LEN(C5)-1)%/10^FIND(RIGHT(C5)," 分角元")))
公式长度178
===================================================================================
公式长度178,似乎长了点,但又不能再简化了。可是根据经验,通常情况下实现一个功能,公式长度一般很少长于150的,所以我想一定还有别的思路。
经过观察,你会发现,人民币的面额有个规律,1分2分5分、1角2角5角、1元2元5元、10元20元50元,100元之后就没有更大的面额了,
就此我们可以构造一个数组,{1;2;5}*{1,10,100,1000,10000}
1 10 100 1000 10000
2 20 200 2000 20000
5 50 500 5000 50000
C列的规律是从上而下票面额逐渐变小,可用LARGE函数来取值,LARGE({1;2;5}*10^{0,1,2,3,4},ROW(3:15))
100元 100
50元 50
20元 20
10元 10
5元 5
2元 2
1元 1
5角 0.5
2角 0.2
1角 0.1
5分 0.05
2分 0.02
1分 0.01
公式最终是:
=IF(C5="","",INT((D$2/1%+1%-SUM(LARGE({1;2;5}*10^{0,1,2,3,4},ROW($2:2))*IF(D$4:D4<"",D$4:D4)))/LARGE({1;2;5}*10^{0,1,2,3,4},ROW(A3))))
公式中添加“+1%”的原因是:经wangjguo44兄验证,可能出现浮点误差而导致错误计算,即“分”的数量与实际不符,少算或者多算一“分”。
[ 本帖最后由 wangg913 于 2010-8-16 22:01 编辑 ] |
评分
-
1
查看全部评分
-
|