PythonTip(16~20)题详解

题目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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值