美文网首页新手练习100题
Python挑战100题(11~13)

Python挑战100题(11~13)

作者: YoYoYoo | 来源:发表于2019-07-17 09:46 被阅读0次

    11、人民币打印金额

    题目:银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。

    在中文大写方式中,0到10以及100、1000、10000被依次表示为: 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万

    以下的例子示范了阿拉伯数字到人民币大写的转换规则:
    1 壹圆
    11 壹拾壹圆
    111 壹佰壹拾壹圆
    101 壹佰零壹圆
    -1000 负壹仟圆
    1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆

    现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示.
    例如:a=1
    则输出:壹圆
    注意:请以Unicode的形式输出答案。提示:所有的中文字符,在代码中直接使用其Unicode的形式即可满足要求,中文的Unicode编码可以通过如下方式获得:u'壹'。
    参考答案:

    # 用字典来建立数字和汉字的对应关系
    d = {'0':'零','1':'壹','2':'贰','3':'叁','4':'肆','5':'伍',
         '6':'陆','7':'柒','8':'捌','9':'玖'}
    unit = {'1':'','2':'拾','3':'佰','4':'仟','5':'万'}
    
    # 接受列表参数,返回转换后的中文大写金额字符串
    def f(L):
        s = []
        n = 1
        for i in L[::-1]:  # 从后往前,逐个从字典中对应成汉字
            if i == '0':
                s.append(d[i])
                n = n + 1
            else:
                s.append(unit[str(n)])
                s.append(d[i])
                n = n + 1
    
        s.reverse()
        for i in s[::-1]: # 处理一下结尾多个零的问题
            if i == '零':
                del s[-1]
            else:
                break
    
        while s.count('零') > 1:  # 处理一下中间有多个零的问题
            s.remove('零')
        return s
    
    # 接受一个数字,调用上面的函数,返回中文大写金额
    def rmb(x):
        if x > 0:
            L = list(str(x))
            if len(L) <= 4:
                l = f(L)
                l.append('圆')
                l = ''.join(l)
                return l
            else:
                La = L[-4:]   # 倒数第4至结束
                Lb = L[:len(L) - 4]
                La = f(La)
                Lb = f(Lb)
                La.append('圆')
                Lb.append('万')
                Lab = Lb + La
                return ''.join(Lab)
        elif x == 0:
            return '零圆'
        else:
            Lc = list(rmb(abs(x)))
            Lc.insert(0,'负')  # 在最前面加上‘负’
            rerurn ''.join(Lc)
    
    b = rmb(1398462)
    print(b)
    

    输出

    壹佰叁拾玖万捌仟肆佰陆拾贰圆
    

    12、公约数个数

    题目:给你两个正整数a,b, 输出它们公约数的个数。
    例如:a = 24, b = 36
    则输出:6
    参考答案:

    a,b = 24,36
    n = 0
    for i in range(1,max(a,b)):
        if a % i == 0 and b % i == 0:
            n = n + 1
        else:
            n = n
    print(n)
    

    一行搞定:

    a,b = 24,36
    print(sum([1 if a % i == 0 and b % i == 0 else 0 for i in range(1, max(a,b))]))
    

    13、逆解最大公约数与最小公倍数

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

    例如:a=3, b = 60
    则输出:12 15
    参考答案:
    来源于:https://blog.csdn.net/weixin_41980474/article/details/80230881
    首先可以知道,这两个数的取值范围在[3,60]之间。

    import math
    a,b = 3,60
    c = min(a,b) # 最大公约数
    d = max(a,b) # 最小公倍数
    l = []  # 增加一个列表用于存放所有满足条件的数组
    for i in range(c,d+1):
        for j in range(c,d+1):
            if math.gcd(i,j) == c and i * j / c == d: # 遍历所有在[3,60]内组成的数组
                l.append((i,j))  # 如果满足条件,将两数打包为tuple添加l列表
    
    l.sort(key = lambda x: x[0] + x[1])  # 使用两数之和作为key对l中的元素进行排序,默认为升序,因此排序后第一组数据为所求的
    print(' '.join(map(str,l[0])))
    

    输出:

    12 15
    

    相关文章

      网友评论

        本文标题:Python挑战100题(11~13)

        本文链接:https://www.haomeiwen.com/subject/wqyokctx.html