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