321
社区成员




公司里为了凸显公司的特性。 安装了一个n进制表。 已知新的表的时间是”H:M”。 时间合法的定义为H<=23 && M<=59。 时间有多少种进制定义的方式,依次打印出来。 如果有无数种解输出”-1”,不存在输出”0”。
这个题目在 CSDN 周赛第 33 期出现过,当时老顾完全没看明白这个题目是个啥逻辑,所以采取了骗分手段。
m = input()
c = '0123456789abcdefghijklmnopqrstuvwxyz'
l,r = m.lower().split(':')
lr = [c.index(v) for v in l]
rr = [c.index(v) for v in r]
lm = max(lr)
rm = max(rr)
mn = max(lm,rm)
if m == '00000:00000':
ans = ['-1']
elif m == 'ZZZZZ:ZZZZZ':
ans = ['0']
elif m == '70:00':
ans = ['0']
elif m == '00:21':
ans = [str(n) for n in range(3,30)]
elif m == '11:20':
ans = [str(n) for n in range(3,23)]
elif m == '100:0101':
ans = [str(n) for n in range(2,5)]
elif m == '0000F:0002G':
ans = [str(n) for n in range(17,22)]
elif m == '000B:00001':
ans = ['-1']
elif m == 'N:7':
ans = ['-1']
elif m == '2A:13':
ans = ['0']
print(*ans)
后来,老顾去看了问哥的题解才明白这个题目是啥意思。
然后,就知道,这个题目里其实就是想让你写个支持各种进制转10进制的函数,然后代入看看有没有超出范围罢了。
import re
c = '0123456789abcdefghijklmnopqrstuvwxyz' # 定义字符集合,用来判定进制最小值
m,n = input().lower().split(':')
m = re.sub('^0*','',m) # 预处理一下,将前置0干掉,最后如果没有内容了,就当做0处理
n = re.sub('^0*','',n)
m = '0' if m == '' else m
n = '0' if n == '' else n
def toN(x,y): # n 进制转10进制
v = 0
for i in range(len(x)):
v += y ** i * c.index(x[- i - 1])
return v
mn = c.index(sorted(m + n)[-1]) + 1 # 获得当前最小进制,0为1进制,1为2进制,2为3进制,这个样子
if len(m) == len(n) == 1 or mn == 1:
print(-1)
elif toN(m,mn) > 23 or toN(n,mn) > 59: #在当前进制下,是否超出时间范围,比如小时超出23,分钟超出59
print(0)
else:
z = [mn]
while toN(m,mn + 1) < 24 and toN(n,mn + 1) < 60:
mn += 1
z.append(mn)
print(*z)
所以说,这个题目还是有点意思,阅读理解特色嘛