试题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为五位及以上的数时,只存储其最后四位即可。(运行时间长)。
答案: