python之人民币金额打印

本文介绍了如何使用Python将阿拉伯数字表示的人民币金额转换为大写。内容包括问题背景、思路解析、参考代码示例、改错练习以及解题总结。涉及到对负数、零的处理,以及对万位的特殊处理,强调了分类讨论和代码优化的重要性。
摘要由CSDN通过智能技术生成

1.贴题

题目来自PythonTip
人民币金额打印


银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。

在中文大写方式中,0到10以及100、1000、10000被依次表示为: 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万

以下的例子示范了阿拉伯数字到人民币大写的转换规则:

1 壹圆

11 壹拾壹圆

111 壹佰壹拾壹圆

101 壹佰零壹圆

-1000 负壹仟圆

1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆

现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示.

例如:a=1

则输出:壹圆

注意:请以Unicode的形式输出答案。提示:所有的中文字符,在代码中直接使用其Unicode的形式即可满足要求,中文的Unicode编码可以通过如下方式获得:u’壹’。

注意:代码无需声明编码!!不要在代码头部声明文件编码,否则会导致语法错误!

Note:数据已于2013-11-19日加强,原来通过的代码可能不能再次通过。


2.说明

预警!!!
这道题个人认为已经算很难了,完全超出了基础题的范畴,如果是初学者建议先不要挑战,或者想要试试水平的可以尝试,但是要做好花大量时间的准备。

预计时间2小时起步,上不封顶。

先简单解释下思路。
首先分析需求:
1. 最多不超过八位数的整数
2. 因为可能出现负数所以需要单独判断是否为负数
3. 数字0-9分别对应中文的十个汉字
4. 八位整数大致可以分为前后两段各四段,原理类似
5. 如果两个非零数字间出现零则需要添加零,但是只能添加一个,不可以添加单位
6. 首位不会出现0,所以不需要考虑该情况
7. 输出是最后以“圆”结尾

3.参考代码

参考了大神pythonwood的代码。
分别给出 一气呵成法分段讨论法 的解说。

一气呵成法

def f(n): #定义主要字符串生成函数
    num = [u"零", u"壹", u"贰", u"叁", u"肆", u"伍", u"陆", u"柒", u"捌", u"玖"] #将数字放在列表num中
    cre = [u"圆", u"拾", u"佰", u"仟", u"万", u"拾", u"佰", u"仟"] #将单位放在列表cre中,根据不同位顺序排列是关键,可以重复,在后面使用下标时可以更方便

    s = "" #定义一个空字符串备用
    L = [int(i) for i in str(n)] #将数字转化为字符串用来遍历每次取一个数再转化为数字,以便后面用于下标

    t = 0 #将初始的t设为0
    while t<len(L): #在t小于L长度时始终循环,保证遍历每一个数
        if t>0 and L[t-1]==0: #一开始t=0所以不会进到里面。之后还有一个循环要不满足后面的循环但是满足这一条件说明:t位上的数不为0但是t位前面那位(从左向右遍历)上的数为0
            s += num[0] #在s字符串最后添加“零”
        s += (num[L[t]] + cre[len(L)-t-1]) #非特殊情况下,首先取数字对应的中文数字,然后取该位上对应的单位,添加到字符串
        t += 1 #将t加一,准备判断下一位的数字
        while t<len(L) and L[t]==0: #从第二位(t=1)开始,先判断该位上数字是否为0,如果为0,则进入到该循环。注意到该循环中t会继续往上+1,也就是一直为零的话会一直在此循环里出不去,直到不为零才会跳出循环回到上层循环的if处
            if t+4==len(L)-1 and L[t]==0: #当找到万位并且万位上的数字为0时
                s += cre[-4] #在s字符串末尾增加“万”字
            t += 1 #其他情况跳过不操作,将t加一判断下一位
    if s[-1] != cre[0]: #所有循环结束后,如果字符串最后一个字符不为“圆”
        s += cre[0] #则在末尾增加“圆”
    return s #返回s字符串


def p(n): #定义判断是不是负数的函数
    return f(n) if n>=0 else u'负'+f(-n) #如果是正数则不做处理否则返回在首部添加“负”的字符串

print(p(a)) #对a执行函数

分段讨论法

def f(n): #定义主要函数返回字符串
    if n==0: #如果输入为0
        return '零' #则返回“零”
    w0 = ['零','壹'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值