pythontip 挑战python ,11-20

挑战python(http://www.pythontip.com/coding/code_oj),11-20题,入门题的解答过程,有更好的解题方法或者编码方法请留言

有部分内容参考了:[1]http://www.cnblogs.com/xiongqiangcs/p/3416072.html

和[2]http://www.cnblogs.com/easymath3/p/3468800.html

环境:python 2.7.5

11:结尾0的个数

给你一个正整数列表 L, 如 L=[2,8,3,50], 输出L内所有数字的乘积末尾0的个数,
如样例L的结果为2.(提示:不要直接相乘,数字很多,可能溢出)

思路:计算所有数中含有多少个因子2和5

Python代码:

a,b = 0,0

for i in L:
    while (i%2 == 0):
        i /= 2
        a += 1
    while (i%5 ==0):
        i /= 5
        b += 1
print min(a,b)

12:结尾非零数的奇偶性

给你一个正整数列表 L, 如 L=[2,8,3,50], 判断列表内所有数字乘积的最后一个非零数字的奇偶性,
奇数输出1,偶数输出0. 如样例输出应为0

Python代码:

a,b = 0,0

for i in L:
    while (i%2 == 0):
        i /= 2
        a += 1
    while (i%5 ==0):
        i /= 5
        b += 1
print 0 if a>b else 1

13:光棍的悲伤

光棍们对1总是那么敏感,因此每年的11.11被戏称为光棍节。
鄙人光棍几十载,光棍自有光棍的快乐。让我们勇敢面对光棍的身份吧,
现在就证明自己:给你一个整数a,数出a在二进制表示下1的个数,并输出。

Python代码:

n = 0
while a:
    n += a%2
    a /= 2
print n

14:Python之美

输出Python之禅
注意:输出python之禅的源码即可,不用转换为英文。(小小的提示:print this.s)
思路:参考:http://blog.csdn.net/gzlaiyonghao/article/details/2151918

Python代码:

import this
print this.s

15:大小写转换

给定一个字符串a, 将a中的大写字母 转换成小写,其它字符不变,并输出。

Python代码:

print a.lower()

16:人民币金额打印

注明:数据已于2013-11-19日加强,原来通过的代码可能不能再次通过。
注意:由于中文乱码问题,输出时请先decode("utf8"),例如你要输出ans = "零圆", print ans.decode("utf8").
银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为:
    零壹贰叁肆伍陆柒捌玖拾佰仟万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:

1       壹圆
11      壹拾壹圆
111     壹佰壹拾壹圆
101     壹佰零壹圆
-1000   负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆

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

疑问:这个题我觉得有点问题,我自己写的程序一直没过,用了参考链接1的代码也没过,用了参考2的代码过了。但是参考2的代码对100000的输出结果为“拾万零圆”,对于101000的输出是“拾万壹仟圆”,对于1009009的输出是“壹佰零万玖仟零玖圆”,我自己的程序的输出则分别是“拾万圆”,“拾万零壹仟圆”和“壹佰万零玖仟零玖圆”,除了这三种类型的数字之外,其他的输出貌似差不多(这个我没细看)。也把我自己的代码贴一下吧,如果想过的话,请参考本文上方的链接[2]。

Python代码:

chn = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖", "", "拾","佰","仟","万"]
#######0     1    2   3    4    5    6   7    8    9   10   11   12   13  14
#对一个小于一万的4位数字的转换,输出字符串str
def f(n):
    t = []
    str = ""
    flag = 0 #是否有连续0的标记
    while n :
        t.append( n % 10)
        n /= 10
    i = len(t)-1
    for tmpi in range(i, -1, -1):
        if t[tmpi] != 0:
            if flag == 1:
                str += chn[0]
                flag = 0
            str += chn[t[tmpi]] + chn[tmpi+10]
        elif flag == 0:
            flag = 1
    return str

def money(a):
    mstr = ''
    if a<0:
        mstr+="负"
        a = -a
    elif a == 0:
        mstr = "零"#.decode("utf8")
    else:
        nh = a/10000
        nl = a%10000
        if nh != 0:
            mstr = mstr + f(nh) + "万"
            if (nh %10 == 0 or nl /1000 == 0) and nl !=0 :   
                mstr += "零"
        if nl !=0:
            mstr+= f(nl)
    mstr+= "圆"
    return mstr
print money(a).decode("utf8")

17:公约数的个数

给你两个正整数a,b,  输出它们公约数的个数。

Python代码:

def gcd(a,b):
    if a<b:
        a,b = b,a
    while b:
        a,b = b,a%b
    return a
d = gcd(a,b)
n = 1
for i in range(1, d/2+1):
    if d%i == 0:
        n += 1
print n

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

我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。
今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。
输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。

思路:和最小的那组解,肯定两个数最接近,可以画图看一下。也可以用求导什么的证明一下。

Python代码:

def gcd(a,b):
    if a<b:
        a,b = b,a
    while b:
        a, b = b, a%b
    return a

pq = b/a
for p in range(int(pq**(1.0/2)), 0, -1):
    if (pq%p == 0) and gcd (pq/p, p) ==1:
        print a*p, a*pq/p
        break

19:单身情歌

抓不住爱情的我 
总是眼睁睁看它溜走 
...

现在来练习一下发现爱的能力,给你一个字符串a,如果其中包含"LOVE"(love不区分大小写)则输出LOVE,否则输出SINGLE。

Python代码:

print "LOVE" if 'love' in a.lower() else "SINGLE"

20:信息加密

给你个小写英文字符串a和一个非负数b(0<=b<26), 将a中的每个小写字符替换成字母表中比它大b的字母。
这里将字母表的z和a相连,如果超过了z就回到了a。例如a="cagy",b=3, 则输出 fdjb

Python代码:

r = ""
for i in a:
    t = ord(i)+b if ord(i)+b <=ord('z') else ord(i)+b-26
    r += chr(t)
print r