第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
============================================================