2019年第十届蓝桥杯 - 省赛 - C/C++大学B组

试题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进制,但又略不同,利用相似的关系及一些处理得结果。

答案:

2019年第十届蓝桥杯 - 省赛 - C/C++大学B组

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

答案:

2019年第十届蓝桥杯 - 省赛 - C/C++大学B组

 

上一篇:2019年百度Android面试题-公共技术点之-View-绘制流程,Android面试复习重点


下一篇:深度技术W10系统中绑定MAC地址和IP地址的设置技巧