Skip to content

Latest commit

 

History

History
84 lines (61 loc) · 2.41 KB

File metadata and controls

84 lines (61 loc) · 2.41 KB

从零开始的记账工具人

  • 题目分类:general

  • 题目分值:100

如同往常一样,你的 npy 突然丢给你一个购物账单:“我今天买了几个小玩意,你能帮我算一下一共花了多少钱吗?”

你心想:又双叒叕要开始吃土了 这不是很简单吗?电子表格里面一拖动就算出来了

只不过拿到账单之后你才注意到,似乎是为了剁手时更加的安心,这次的账单上面的金额全使用了中文大写数字

注意:请将账单总金额保留小数点后两位,放在 flag{} 中提交,例如总金额为 123.45 元时,你需要提交 flag{123.45}

打开/下载题目


这道题考察选手基本的编程处理数据的能力,常见的编程语言都可以编写出解题代码。

解法 1

手工计算(听说真的有同学是这样做的?)

解法 2

使用任意文本编辑器(或者 Excel 本身)做字符串替换,替换规则如下:

'零' -> ''
'壹' -> '1'
'贰' -> '2'
'叁' -> '3'
'肆' -> '4'
'伍' -> '5'
'陆' -> '6'
'柒' -> '7'
'捌' -> '8'
'玖' -> '9'
'拾' -> '*10+'
'佰' -> '*100+'
'仟' -> '*1000+'
'元' -> '+'
'角' -> '/10+'
'分' -> '/100'
'++' -> '+'
'整' -> ''

然后如果开头有乘号或者结尾有加号,去掉即可,这样的数学表达式求值即可得到正确的结果。

解法 3

编程求解,这里使用 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)

最后输出的结果可能有一些浮点误差,自己四舍五入一下就好了。(更好的办法是使用整数来计算,但是我比较懒就不写了)