试题B:年号字串
小明用字母A 对应数字1,B 对应2,以此类推,用Z 对应26。对于27 以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应27,AB 对 应28,AZ 对应52,LQ 对应329。 请问2019 对应的字符串是什么?
num = int(input("请输入一个数:"))
i = 1 # 先将该转化当作十进制转化为二十六进制,i用来看数位
while 26**i < num: # 通过26的幂,求出换成26进制的位数 i
i += 1
lt = [] # 建立列表来存放各数位上的数
for j in range(i-1, -1, -1):
lt.append(num//(26**j)) # 通过求整商,求该位上的数
num -= lt[i-j-1]*26**j # 因为已存放了数,所以要减去存的数,然后继续去求
for k in range(i-1, 0, -1): # 通过for循环,然后判断除下标为0外的数,如果小于等于0,就从上一位借一,就是本位加26,上一位减一
if lt[k] <= 0:
lt[k] += 26
lt[k-1] -= 1
if 0 in lt: # 这步其实是在判断首位数是否为0,因为经过上面操作后,其他位置上的数不可能为0了,并使得首位可能为0
lt.remove(0) # 如果首位为0,就移除
for i in lt:
print(chr(i+64), end='') # [A-Z]的ASCII码为[65-90],然而[1-26]代表[A-Z],所有用chr(i+64)来得结果
类似与26进制,但又略不同,利用相似的关系及一些处理得结果。
答案:
试题C:数列求和
问题描述:给定数列1,1,1,3,5,9,17,…从第四项开始,每项都是前三项的和。求第20190324项的最后四位数。
lt = [1,1,1]
for i in range(3,20190324):
ans = lt[0]+lt[1]+lt[2]
if len(str(ans)) > 4:
lt.append(int(str(ans)[-4:])) # 先将ans变成字符串,然后取其后四位,并转化成整数
else:
lt.append(ans)
lt.pop(0) # 每次添加后,删除第一个数,方便操作,且只需要三个数就能求后一个数
print(lt[-1])
题目只要求求第20190324项的最后四位数,直接求出第20190324项,然后再取后四位数,方法不可行,因为会溢出,然而最后四位数和前面数没有关系,所以我们可以当ans小于五位数时,直接储存,当ans为五位及以上的数时,只存储其最后四位即可。(运行时间长)。
答案: