PythonTip(16~20)题详解

来源:互联网 发布:淘宝卖的玻璃杯 编辑:程序博客网 时间:2024/06/05 10:32

题目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 sdef 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 sans=GetDX(a)print ans#.deocde('utf-8')

举一反三

1.

# -*- coding: UTF-8 -*-a = 12334def 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 = 0if a == 1 or b == 1: #考虑 a 和 b 都是 1 的情况    count += 1    print countelse:          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 = 12b = 24print 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,an=b/asum=2*ns1=0s2=0for 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 = 10b = 4import mathdef gcd(p,q):    p,q = (p,q) if (p > q) else(p,q)    while(p%q!=0):        p,q = q,p%q    return qa,b = (a,b) if a<b else (b,a)diff=b/auper = int(math.sqrt(diff)) +1XYList=[(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 resa=conve(a,b)print a

举一反三

1.

# -*- coding: UTF-8 -*-a = 'cagy'b = 3print ''.join(map(lambda x : chr(ord(x) + b - 26) if ord(x) + b > 122 else chr(ord(x) + b) , a))
0 0
原创粉丝点击