-
题目分类:general
-
题目分值:100
如同往常一样,你的 npy 突然丢给你一个购物账单:“我今天买了几个小玩意,你能帮我算一下一共花了多少钱吗?”
你心想:又双叒叕要开始吃土了 这不是很简单吗?电子表格里面一拖动就算出来了
只不过拿到账单之后你才注意到,似乎是为了剁手时更加的安心,这次的账单上面的金额全使用了中文大写数字
注意:请将账单总金额保留小数点后两位,放在 flag{}
中提交,例如总金额为 123.45 元时,你需要提交 flag{123.45}
这道题考察选手基本的编程处理数据的能力,常见的编程语言都可以编写出解题代码。
手工计算(听说真的有同学是这样做的?)
使用任意文本编辑器(或者 Excel 本身)做字符串替换,替换规则如下:
'零' -> ''
'壹' -> '1'
'贰' -> '2'
'叁' -> '3'
'肆' -> '4'
'伍' -> '5'
'陆' -> '6'
'柒' -> '7'
'捌' -> '8'
'玖' -> '9'
'拾' -> '*10+'
'佰' -> '*100+'
'仟' -> '*1000+'
'元' -> '+'
'角' -> '/10+'
'分' -> '/100'
'++' -> '+'
'整' -> ''
然后如果开头有乘号或者结尾有加号,去掉即可,这样的数学表达式求值即可得到正确的结果。
编程求解,这里使用 Python 语言。
我们首先使用 Excel(或者其他商业的、开源的、在线的电子表格工具)将下载的文件转换为 .csv
格式,即逗号分隔的文本。(当然,你也可以使用解析 Excel 文件格式的库来处理)
然后在 Python 中安装 cn2an 这个中文数字转换的库:
python3 -m pip install cn2an
然后使用 Python 程序处理这个文件:
import cn2an
lines = open('bills.csv').readlines()[1:]
s = 0
for line in lines:
a, b = line.strip().split(',')
n = 0
if '元' in a:
y, a = a.split('元')
n += cn2an.cn2an(y, "smart")
if '角' in a:
y, a = a.split('角')
n += cn2an.cn2an(y, "smart") / 10
if '分' in a:
y, a = a.split('分')
n += cn2an.cn2an(y, "smart") / 100
s += n * int(b)
print(s)
最后输出的结果可能有一些浮点误差,自己四舍五入一下就好了。(更好的办法是使用整数来计算,但是我比较懒就不写了)