人命币金额打印
题目描述思路解析完整代码题目描述
题目描述:
银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为: 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:
1 壹圆
11 壹拾壹圆
111 壹佰壹拾壹圆
101 壹佰零壹圆
-1000 负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆
现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示.
例如:a=1
则输出:壹圆
思路解析
1:把数字金额转为文字描述,首先数字0-9转为中文很简单,根据对应关系一一转换即可,得到第一个转换列表trans_list1,具体可对照代码看。
2:然后就是每个数字后跟着的单位描述,个位是圆,十位是拾,百位是佰,那么也是有一定顺序关系的,得到单位描述的转换列表,trans_list2。
3:然后就可以试一试了。
# pythondef func(a):trans_list1 = [u'零', u'壹', u'贰', u'叁', u'肆', u'伍', u'陆', u'柒', u'捌', u'玖']trans_list2 = [u'圆', u'拾', u'佰', u'仟', u'万', u'拾', u'佰', u'仟']# enumerate(str(a))将数字按从左到右的顺序和index对应起来# 如1230对应为 (0,1)(1,2)(2,3)(4,0)for index, str_n in enumerate(str(a)):result += trans_list1[int(str_n)] + trans_list2[len(str(a))-1-index]return (result)while True:a = int(input())print(func(a))
发现输出的结果中对于几种特殊情况的处理还有点问题:
1:对于数字为0的处理,0的位置上会生成零圆,零佰,零仟这时候是有问题的,如100 1001会生成壹佰零拾零万 壹仟零佰零拾壹圆我们想要的是壹佰万 壹仟零壹圆,多观察几个类似带零的数字,思考过后,需要把数字为零的单位去掉,如零佰需要把佰去掉,且零被夹在中间时如101 1001是需要保留一个零的,那么得到第三个转换列表。
replace_list = [(u'零拾', u'零'), (u'零佰', u'零'), (u'零仟', u'零'), (u'零零零',u'零'), (u'零零','零'), (u'零万', u'万'), (u'零圆', u'圆')]```
零万和零圆不替换为零这是因为即使为零,万这个单位和圆这个单位都是必要的。
顺序也是有说法的,(u’零万’, u’万’), (u’零圆’, u’圆’)需要摆在最后面,因为100 1000这种情况摆在前面会变成壹佰零万 柒仟零圆这样子的话总会保留一个零下来,所以放到最后把这种情况的零消除掉。
2:对负数的处理,逻辑内暂时是没有的
(result, a) = (u'负', abs(a)) if a < 0 else ('', a)
如果是非负数就返回它本身并初始化result为空字符’’,如果是负数就返回它的绝对值,并把result初始化为’负’。
3:对于金额0的处理
return (u'零圆' if a==0 else result)
在结果最后,如果是数字0直接返回’零元’,否则返回转换生成的结果(否则数字0自动生成的结果为’圆’,不符合题目要求)。
综上所述,下面给出完整的代码逻辑。
完整代码
# pythondef func(a):trans_list1 = [u'零', u'壹', u'贰', u'叁', u'肆', u'伍', u'陆', u'柒', u'捌', u'玖']trans_list2 = [u'圆', u'拾', u'佰', u'仟', u'万', u'拾', u'佰', u'仟']replace_list = [(u'零拾', u'零'), (u'零佰', u'零'), (u'零仟', u'零'), (u'零零零',u'零'), (u'零零','零'), (u'零万', u'万'), (u'零圆', u'圆')](result, a) = (u'负', abs(a)) if a < 0 else ('', a)for index, str_n in enumerate(str(a)):result += trans_list1[int(str_n)] + trans_list2[len(str(a))-1-index]for k,v in replace_list:result = result.replace(k, v) return (u'零圆' if a==0 else result)while True:a = int(input())print(func(a))