题目16:人民币金额打印
描述:银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为:
零壹贰叁肆伍陆柒捌玖拾佰仟万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:
1 壹圆
11 壹拾壹圆
111 壹佰壹拾壹圆
101 壹佰零壹圆
-1000 负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆
现在给你一个整数a(|a|<100000000), 打印出人民币大写表示.
注意:请以Unicode的形式输出答案。你可以通过decode(“utf8”)来将utf8格式的字符串解码为Unicode,例如你要输出ans = “零圆”, print ans.decode(“utf8”).
Note:数据已于2013-11-19日加强,原来通过的代码可能不能再次通过。
答案:
num_list=u"零壹贰叁肆伍陆柒捌玖"
wei_list=u'万圆拾佰仟万拾佰仟亿拾佰仟'
def GetDX(num):
s=''
flag=0
if num<0:
num=-num
flag=1
wei=len(str(num))
for i in str(num):
s=s+num_list[int(i)]+wei_list[wei]
wei=wei-1
s=Modify(s)
if num==0:
s=u'零圆'
if flag:
s=u'负'+s
return s
def Modify(s):
if u'零仟' in s:
s=s.replace(u'零仟',u'零')
if u'零佰' in s:
s=s.replace(u'零佰',u'零')
if u'零拾' in s:
s=s.replace(u'零拾',u'零')
while u'零零' in s:
s=s.replace(u'零零',u'零')
if u'零万' in s:
s=s.replace(u'零万',u'万')
if u'零圆' in s:
s=s.replace(u'零圆',u'圆')
return s
ans=GetDX(a)
print ans#.deocde('utf-8')
举一反三
1.
# -*- coding: UTF-8 -*-
a = 12334
def f(n): # n < 10*8
if n==0:
return '零圆'
w0 = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖']
w1 = ['圆','拾','佰','仟','万','拾','佰','仟']
# w0 = '零壹贰叁肆伍陆柒捌玖'
# w1 = '圆拾佰仟万拾佰仟'
r = []
L = [int(i) for i in str(n)]
t = 0
while t<len(L):
if t>0 and L[t-1]==0: # common
r.append('零')
r.append(w0[L[t]] + w1[len(L)-t-1])
t += 1
while t<len(L) and L[t]==0: # ***while-while***
# fix bug 1000001 "壹佰零壹圆"
if t+4==len(L)-1 and L[t]==0:
r.append('万')
L[t]==1
t += 1
return ''.join(r)
def p(n): # n < 10*8
return f(n) if n>=0 else '负'+f(-n)
print p(a)
题目17:公约数的个数
描述:给你两个正整数a,b, 输出它们公约数的个数。
分析:此题与之前求两个数的公约数是一样的,这里只是多了一个计数的步骤。
答案: 自己做出的答案,真的,满满的都是开心O(∩_∩)O~~
l1=[]
l2=[]
count = 0
if a == 1 or b == 1: #考虑 a 和 b 都是 1 的情况
count += 1
print count
else:
for i in range(1,a+1): #找出 a 的约数
if a%i == 0:
l1.append(i)
for j in range(1,b+1): #找出 b 的约数
if b % j == 0:
l2.append(j)
print len(set(l1) & set(l2)) #利用集合的性质将公约数找出
举一反三
1.用一行代码解决,比较绕,看懂就可以了。
# -*- coding: UTF-8 -*-
a = 12
b = 24
print len([x for x in range(1,a+1) if a % x ==0 and b % x ==0])
题目18:逆解最大公约数与最小公倍数
描述:我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。
今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。
输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。
注:所给数据都有解,不用考虑无解的情况。
答案:
if a>b:
a,b=b,a
n=b/a
sum=2*n
s1=0
s2=0
for i in range(1,n):
if n%i==0:
if (i+(n/i))<sum:
sum=i+(n/i)
s1=min(i,n/i)
s2=max(i,n/i)
print str(s1*a)+' '+str(s2*a)
举一反三
1.
# -*- coding: UTF-8 -*-
a = 10
b = 4
import math
def gcd(p,q):
p,q = (p,q) if (p > q) else(p,q)
while(p%q!=0):
p,q = q,p%q
return q
a,b = (a,b) if a<b else (b,a)
diff=b/a
uper = int(math.sqrt(diff)) +1
XYList=[(i,diff/i) for i in range(uper, 0,-1) if diff%i ==0] #求所有因数
XYList =[i for i in XYList if gcd(i[0],i[1])==1]#去除非互质项
XYList.sort(cmp = lambda it1,it2:(it1[0]+it1[1])<(it2[0]+it2[1]) ) #排序,使第一项和最小
x,y=XYList[0]
x,y = (x*a,y*a) if x<y else(y*a,x*a)
print x,y
题目19:单身情歌
描述:现在来练习一下发现爱的能力,给你一个字符串a,如果其中包含”LOVE”(love不区分大小写)则输出LOVE,否则输出SINGLE。
分析:先把所有的字符转化成小写,然后判断里面书否有 ‘love’
答案:
a = a.lower()
if 'love' in a:
print 'LOVE'
else:
print 'SINGLE'
题目20:信息加密
描述:给你个小写英文字符串a和一个非负数b(0<=b<26), 将a中的每个小写字符替换成字母表中比它大b的字母。这里将字母表的z和a相连,如果超过了z就回到了a。例如a=”cagy”,b=3, 则输出 fdjb
答案:
def conve(a,b):
low_set='abcdefghijklmnopqrstuvwxyz'*2
res=''
for x in a:
res+=low_set[low_set.index(x)+b]
return res
a=conve(a,b)
print a
举一反三
1.
# -*- coding: UTF-8 -*-
a = 'cagy'
b = 3
print ''.join(map(lambda x : chr(ord(x) + b - 26) if ord(x) + b > 122 else chr(ord(x) + b) , a))