一起挑战pythontip的题目(4)

简介: 一起挑战pythontip的题目(4)

第16题:人民币金额打印


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


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


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


1    壹圆

11    壹拾壹圆

111    壹佰壹拾壹圆

101    壹佰零壹圆

-1000    负壹仟圆

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

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


例如:a=1

则输出:壹圆

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


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


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


示例:输入:a = 0

输出:零圆


def Translate(num):
    '''数字转人民币格式'''
    if type(num)==type(''):
        try: f=float(num)
        except: return u'金额字符串无法转换成数字!'
        if f<0: num=num[1:]
        tmp = num.split('.')
    elif type(num) in [type(0),type(0.0)]:
        fNum=1.0e+16 # 如果是数字大于100兆会被截尾处理,字符串不受影响
        if not 0<=num<fNum: return f'金额必须为非负数且小于{fNum}!'
        tmp = str(num).split('.')
    else: return u'金额必须是数字或字符串!'
    ret,cn='', ['']*3
    cnStr = (u'角分整',u'零壹贰叁肆伍陆柒捌玖',u'元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟京拾佰仟')
    for i in range(3): cn[i]=[c for c in cnStr[i]]
    if len(tmp[0])>len(cn[2]): return u'金额数值过大,已超过设置的最大值!'
    if len(tmp)>1 and len(tmp[1])>2: tmp[1]=tmp[1][:2] #小数大于2位截尾处理
    #转换整数和小数
    for i,n in enumerate(reversed(list(tmp[0]))): ret = cn[1][int(n)]+cn[2][i]+ret
    if len(tmp)>1:
        if tmp[0][-1]=='0': ret += cn[1][0]
        for i,n in enumerate(list(tmp[1])): ret += cn[1][int(n)] + cn[0][i]
    for i in range(2): ret=ret.replace(cn[1][0]+cn[0][i],cn[1][0])
    for i in range(1,4): ret=ret.replace(cn[1][0]+cn[2][i],cn[1][0])
    for i in range(3,1,-1): ret=ret.replace(cn[1][0]*i,cn[1][0])
    for i in range(0,len(cn[2]),4): ret=ret.replace(cn[1][0]+cn[2][i],cn[2][i])
    for i in range(4,10,4): ret=ret.replace(cn[2][i+4]+cn[2][i],cn[2][i+4])
    if ret[0] in {cn[1][0],cn[2][0]}: ret=ret[1:]
    if len(ret)>1:
        if ret[-1] == cn[1][0]: ret=ret[:-1]+cn[0][2]
        if ret[-1] == cn[2][0]: ret+=cn[0][2]
        if ret[0] in {cn[1][0],cn[2][0]}: ret=ret[1:]
    else:
        ret=cn[1][0]+cn[2][0] 
    return ret



这是以前写过的函数,与题目要求类似。原文链接:https://blog.csdn.net/boysoft2002/article/details/115796371

============================================================

第17题:公约数的个数

题目描述:给你两个正整数a,b,  输出它们公约数的个数。

例如:a = 24, b = 36

则输出:6

示例:输入:a = 24

b = 36

输出:6


>>> def func(a,b):
  k=0
  for i in range(1,min(a,b)+1):
    if a%i==0 and b%i==0:
      k+=1
  return k
>>> func(a,b)
6
>>> 


或:用推导式把公约数写入一个列表,长度即个数。

len([i for i in range(1,min(a,b)+1) if a%i==0 and b%i==0])




============================================================

第18题:逆解最大公约数与最小公倍数

题目描述:我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。注:所给数据都有解,不用考虑无解的情况。

例如:a=3, b = 60

则输出:12 15



============================================================

第19题:单身情歌

题目描述:抓不住爱情的我 总是眼睁睁看它溜走 ...现在来练习一下发现爱的能力,给你一个字符串a,如果其中包含"LOVE"(love不区分大小写)则输出LOVE,否则输出SINGLE。

例如:a ="OurWorldIsFullOfLOVE"

则输出:LOVE

示例:输入:a = "OurWorldIsFullOfLOVE"

输出:LOVE



============================================================

第20题:信息加密

题目描述:给你个小写英文字符串a和一个非负数b(0<=b<26), 将a中的每个小写字符替换成字母表中比它大b的字母。这里将字母表的z和a相连,如果超过了z就回到了a。

例如a="cagy", b=3,

则输出 :fdjb

示例:输入:a = "cagy"

b = 3

输出:fdjb

============================================================



目录
相关文章
|
Python
一起挑战pythontip的题目(12)
一起挑战pythontip的题目(12)
70 0
|
Python
一起挑战pythontip的题目(29)
一起挑战pythontip的题目(29)
69 0
|
机器学习/深度学习 Python
一起挑战pythontip的题目(24)
一起挑战pythontip的题目(24)
92 0
|
存储
一起挑战pythontip的题目(33)
一起挑战pythontip的题目(33)
134 0
|
数据安全/隐私保护
一起挑战pythontip的题目(7)
一起挑战pythontip的题目(7)
73 0
一起挑战pythontip的题目(36-1)
一起挑战pythontip的题目(36-1)
57 0
一起挑战pythontip的题目(6)
一起挑战pythontip的题目(6)
63 0
一起挑战pythontip的题目(32)
一起挑战pythontip的题目(32)
69 0
一起挑战pythontip的题目(19)
一起挑战pythontip的题目(19)
70 0
|
Python
一起挑战pythontip的题目(3)
一起挑战pythontip的题目(3)
85 0