美文网首页新手练习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)

    11、人民币打印金额 题目:银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完...

  • Python挑战100题(31~33)

    31、取石子问题 题目:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法...

  • Python挑战100题(37~40)

    37、回文数 Ⅰ 题目:若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就...

  • Python挑战100题(34~36)

    34、汉诺塔 题目:在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝...

  • Python挑战100题(21~26)

    21、山峰的个数 题目:十一假期,小P出去爬山,爬山的过程中每隔10米他都会记录当前点的海拔高度(以一个浮点数表示...

  • Python挑战100题(27~30)

    27、分拆素数和 题目:把一个偶数拆成两个不同素数的和,有几种拆法呢?现在来考虑考虑这个问题,给你一个不超过100...

  • Python挑战100题(14~20)

    14、信息加密 题目:给你个小写英文字符串a和一个非负数b(0<=b<26), 将a中的每个小写字符替换成字母表中...

  • Python挑战100题(1~10)

    1、字符串逆序 题目:给你一个字符串 a, 请你输出逆序之后的a。例如:a=‘xydz’则输出:zdyx答:最简单...

  • Python学习100例之1-10

    此Python版本为2.7,其他例子如下:Python学习100例之11-20Python学习100例之21-30...

  • Python学习100例之21-30

    此Python版本为2.7,其他例子如下:Python学习100例之1-10Python学习100例之11-20P...

网友评论

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

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