人民币转换实现

题目

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

思路

核心思想:递归

具体过程如下:

  1. 首先题目已经告诉需要转换的数字为整数,所以只需要考虑正负号即可;
  2. 构建数字:对应的中文货币字典(人民币中文符号:零壹贰叁肆伍陆柒捌玖拾佰仟万)
  3. 已整整数为例,构造函数rmbConverting:
    • 小于10;-->直接输出
    • 考虑是整拾佰仟万的情况;-->实现通过将其转化为字符串,然后观察0的个数
    • 考虑小于100(两位数);--比较简单
    • 考虑小于1000(三位数);-->将其转化为整佰+两位数,目的方便递归;
    • 考虑小于10000(四位数);-->将其转化为整仟+三位数
    • 对于超过10000的,可以考虑分成两半:a//10000a-a//10000*10000,然后递归即可;
  4. 最后输出时,区分正负号。为了方便构建函数printrmb

完整程序


rmb_unit=list(u'零壹贰叁肆伍陆柒捌玖拾佰仟万')
rmb_num=[0,1,2,3,4,5,6,7,8,9,10,100,1000,10000]
rmb_dict={i:j for i,j in zip(rmb_num,rmb_unit)}

def rmbConverting(a,Dict=rmb_dict):
    """
    这个函数只处理正数的情况
    @params:a为输入的整数
    @params: Dict为数字对应的中文,type:dict
    """
    unit=[i[0] for i in list(Dict.items())[1:]]
    str_a_len=len(str(a))
    all_0_num=list(str(a)).count('0')
    if a <=10:
        return Dict[a]+'圆'
    elif str_a_len-all_0_num==1:
        tmp=10**all_0_num
        return Dict[a/tmp]+Dict[tmp]+'圆'
    elif a<100:
        return Dict[a//10]+Dict[10]+Dict[a-a//10*10]+'圆'
    elif a<1000:
        b=a//100
        c=a-b*100
        res=Dict[b]+Dict[100]+rmbConverting(c) if c>=10 else Dict[b]+Dict[100]+'零'+rmbConverting(c) 
        return res
    elif a<10000:
        b=a//1000
        c=a-b*1000
        return Dict[b]+Dict[1000]+rmbConverting(c) if c>=100 else Dict[b]+Dict[1000]+'零'+rmbConverting(c)
    else:
        b=a-a//10000*10000
        return rmbConverting(a//10000)[:-1]+Dict[10000]+rmbConverting(b) if b>=1000 else rmbConverting(a//10000)[:-1]+Dict[10000]+'零'+rmbConverting(b)
   
def printrmb(a):
    print( '负'+rmbConverting(abs(a)) if a<0 else rmbConverting(a))
        
if __name__=='__main__':
    a=1234
    printrmb(a)



posted @ 2020-04-22 13:50  LgRun  阅读(214)  评论(0编辑  收藏  举报