Files
2020-11-07 05:01:04 +08:00

1.7 KiB

从零开始的记账工具人

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

解法 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)

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