是时候公布第一步的参考答案了(用Groovy写的):
def paidback = ['FC':0, 'TM':0, 'P':0, 'Y':0]
def items = [
[ 500+500+15, 'FC', ['FC','TM','P','Y']],
[575+330+256, 'TM', ['FC','TM','P','Y']],
[ 138, 'P', ['FC','TM','P','Y']],
[ 15, 'TM', ['FC','TM']],
[ 15, 'P', [ 'P', 'Y']],
[ 17, 'P', [ 'P','TM']],
[ 20, 'Y', ['FC', 'Y']],
[ 3, 'FC', ['FC', 'Y']],
[ 12, 'P', [ 'P','TM']],
[ 10+9, 'FC', ['FC', 'Y']],
[ 9, 'TM', ['TM', 'P']],
[ 10, 'P', [ 'P', 'Y']],
[ 10, 'TM', ['FC','TM']],
[ 12, 'TM', ['TM', 'P']],
[ 17, 'FC', ['FC', 'Y']]
]
def calculatePaidback(namelist, name, payer, amount) {
if (namelist.contains(name)) {
def n = namelist.join().length()
payer == name ? amount * (1 - name.length() / n) : -amount * name.length() / n
} else 0
}
items.each { item ->
paidback.each { pb ->
pb.value += calculatePaidback(item[2], pb.key, item[1], item[0])
}
}
paidback
输出结果为:
Result: [FC:230.8333333659, TM:389.8333333713, P:-222.8333333369, Y:-397.8333333326]
跟“利用Excel的公式”计算结果一致(1分钱的误差忽略)
拢共30 LOC,核心计算部分仅为11 LOC -- Groovy有多么的groovy, 由此可见一斑 ![]()
第二步要解决的问题是:有一个图,带5节点(FC, TM, P, Y四个节点,再加一虚拟节点),四条有向边。如何把该图变形化简?
(图可能有N型,Z型,凹型等,只需给出其中一个即可)
To be continued...
本文介绍了一个使用Groovy语言实现的费用结算算法,并给出了具体的代码实现和运行结果。该算法能够根据参与者的名字和支付金额计算出各自的应退款额。
8万+

被折叠的 条评论
为什么被折叠?



