zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    pip 笔记
    Codeforces Round #739
    leetcode周赛 248
    AcWing周赛 6
    AcWing周赛 5
    算法提高--最长上升子序列一
    算法提高--数字三角形模型
    数据结构--线段树
    leetcode周赛 243
    AcWing周赛 1
  • 原文地址:https://www.cnblogs.com/zijin/p/3483877.html
Copyright © 2011-2022 走看看