PythonTip挑战题(16-25)

北城余情 提交于 2019-12-02 05:53:06

16.人民币金额打印

银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为: 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:
1 壹圆
11 壹拾壹圆
111 壹佰壹拾壹圆
101 壹佰零壹圆
1000 负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆
现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示
例如:a = 90901001
则输出:玖仟零玖拾万壹仟零壹圆

a = 90901001

digit = [u'零',u'壹',u'贰',u'叁',u'肆',u'伍',u'陆',u'柒',u'捌',u'玖']
weight = [u'圆',u'拾',u'佰',u'仟',u'万',u'拾',u'佰',u'仟']
Z = [(u'零仟',u'零佰',u'零拾',u'零零零',u'零零',u'零万',u'零圆'),(u'零',u'零',u'零',u'零',u'零',u'万',u'圆')]
num = str(abs(a)) #abs()绝对值  str()整数转换成字符串
s = u'负' if a<0 else ''
for i,x in enumerate(num): #enumerate()
    s += digit[int(x)] + weight[len(num)-i-1]
for z,v in zip(Z[0],Z[1]): #zip()
    s = s.replace(z,v) #str.replace(old,new)
print(u"壹圆") if a==0 else print(s)

17.公约数的个数

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

a = 24
b = 36

print(len([x for x in range(1,min(a,b)+1) if a%x==0 and b%x==0]))

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

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

a = 3
b = 60

x = [x for x in range(1,max(a,b)+1) if max(a,b) % x == 0 ]
y = [int(a*b/i) for i in x]
z = [(x0,y0) for x0,y0 in zip(x,y)] #zip() 返回元组组成的对象
ans = sorted(z,key=sum)[0] #sorted(iterable,key=None,reverse=False)
print('%s %s' % (min(ans),max(ans)))  #没有考虑无解以及a=1的情况

19.单身情歌

给你一个字符串a,如果其中包含"LOVE"(love不区分大小写)则输出LOVE,否则输出SINGLE
例如:a = “OurWorldIsFullOfLOVE”
则输出:LOVE

a = "OurWorldIsFullOfLOVE"

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

a = "cagy"
b = 3

print(''.join([chr(ord('a')+(ord(x)-ord('a')+b)%26) for x in a]))

a = "cagy"
b = 3

t = ""
for c in a:
    if 'a' <=c <= 'z':
        t += chr(ord('a') + (ord(c)-ord('a') + b) % 26)  #密文字符 = (原文字符 + b) % 26
    else:
        t += c
print(t)
#chr(u) u为Unicode编码,返回其对应的字符
#ord(x) x为字符,返回其对应的Unicode编码

21.回文子串

给你一个字符串a和一个正整数n,判断a中是否存在长度为n的回文子串。如果存在,则输出YES,否则输出NO。
回文串的定义:记串str逆序之后的字符串是str1,若str=str1,则称str是回文串,如"abcba".

a = "adeda"  #字符串a
n = 5  #长度为n的回文子串

result = "NO"
for i in range(len(a)):
    if (i+n<=len(a)):
        str = a[i:i+n]
        str1 = str[::-1]
        if (str==str1):
            result = "YES"
            break
print(result)

22.时间就是金钱

给你两个时间st和et(00:00:00<=st <= et<=23:59:59), 请你给出这两个时间间隔的秒数。
如:st=“00:00:00”, et=“00:00:10”, 则输出10.

st="00:56:00"
et="01:00:10"

a = st.split(":")
b = et.split(":")
c = []
for i in range(3):
    c.append(int(b[i])-int(a[i]))
d=c[0]*3600+c[1]*60+c[2]
print(d)

st="00:56:00"
et="01:00:10"

import datetime
a = datetime.datetime.strptime(et,"%H:%M:%S")
b = datetime.datetime.strptime(st,"%H:%M:%S")
print((a-b).seconds)

23.365 Or 366?

一年有多少天,这是个大问题,很值得思考。现在给你一个年份year(year为四位数字的字符串,如"2008",“0012”),你输出这一年的天数。如year=“2013”, 则输出365。

year = "2019"

year1 = int(year)
if year1 % 4 == 0 and year1 % 100 != 0 or year1 %400 == 0:
    print(366)
else:
    print(365)

print(366 if int(year)%4==0 and int(year)%100!=0 or int(year)%400==0 else 365)

import calendar
print(366 if calendar.isleap(int(year)) else 365)
#calendar.isleap(year) 闰年返回True,否则False

24.一马当先

下过象棋的人都知道,马只能走’日’字形(包括旋转90°的日),现在想象一下,给你一个n行m列网格棋盘,
棋盘的左下角有一匹马,请你计算至少需要几步可以将它移动到棋盘的右上角,若无法走到,则输出-1.
如n=1,m=2,则至少需要1步;若n=1,m=3,则输出-1。


25.格式化时间

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!