此题为第十五届蓝桥杯模拟赛(第一期)Python赛道的第二道 填空题
题目描述
在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母,依次为 A 到 Z,接下来 26*26 列使用两个字母的组合,依次为 AA 到 ZZ。
请问第 2022 列的名称是什么?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个由大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
我的解题
分析
解决这道题不难,由于是填空题,所以为了节约时间最好,但是事后还是得想办法整个算法来计算这个结果。
现在进入分析:
- A~Z:26
- A*A~Z*Z:676
- A*A*A~Z*Z*Z:17576
显然 2022 是落入在了 A*A*A~Z*Z*Z,所以简单、不完整的算法就是将 2022-26-676,找出剩余 2022-26-676=3*20*22 在 A*A*A~Z*Z*Z (1*1*1~26*26*26)的即可,然后对应字母 C*T*V(错)。- 后面发现问题后,这其实是个进制转换问题!26 进制!我想说到这里,读者应该就明白了吧!(被自己蠢哭了……)
编程
以下是愚蠢之时写的,不过也可以算出正确答案,但是具有范围性,要求输入的数范围在1~26*26*26之内,包含端点。
#用字典推导式生成一个字典,其对应着大写字母和对应的整数
dict = {i-ord('A')+1:chr(i) for i in range(65,91)}
#输出字典
print(dict)
#给定目标数
target_num = 2022
#判断目标数是否大于26,是否落在1~26的范围内
if target_num > 26:
target_num-=26
else:
#落入该区间,计算目标数
for i in range(1,27):
if i == target_num:
print(f"{dict[i]}")
break
#判断目标数是否大于26*26,是否落在1*1~26*26的范围内,否则进行计算
if target_num > 26*26:
target_num-=26*26
else:
#落入该区间,所以开始计算目标数
for i in range(1,27):
for j in range(1,27):
if 26*(i-1)+j == target_num:
print(f"{dict[i]}{dict[j]}")
break
if j<26:
break
##判断目标数是否大于26*26*26,是否落在1*1*1~26*26*26的范围内
if target_num > 26*26*26:
target_num-=26*26*26
else:
#明显落入该区间,所以开始计算目标数
for i in range(1,27):
for j in range(1,27):
for k in range(1,27):
if 26*26*(i-1)+26*(j-1)+k == target_num:
print(f"{dict[i]}{dict[j]}{dict[k]}")
break
if k<26:
break
if j<26:
break
以下代码是清醒的时候写的,可以完成正整数范围的26进制转换。
#用字典推导式生成一个字典,其对应着大写字母和对应的整数
dict = {i-ord('A')+1:chr(i) for i in range(65,91)}
#输出字典
print(dict)
target_num = 2022
result = ""
#进制转换,26进制
while target_num >0:
divisor = target_num % 26
result = dict[divisor] + result
target_num = target_num // 26
print(result)
运行结果
结果即为 BYT。
AI 解题
在Excel中,列的编号与字母名称之间存在一个转换规则。从A开始,每增加1列,字母序号按顺序递增,当达到Z后,下一个列是AA,然后是AB,直到ZZ,接着是AAA,以此类推。我们可以编写一个Python函数来计算给定列数对应的Excel列名:
def excel_column_name(column_number: int) -> str:
dividend = column_number
column_name = ""
while dividend > 0:
remainder = (dividend - 1) % 26
column_name = chr(65 + remainder) + column_name
dividend = (dividend - remainder) // 26
return column_name
# 计算第2022列的名称
column_name_2022 = excel_column_name(2022)
print(f"第2022列的名称是:{column_name_2022}")
运行这段代码,会输出“第2022列的名称是:BYT”。
看到 AI 写的代码,仔细思考了一下算法,我是被自己蠢哭了,因为你越高位(26*26、26*26*26),都是可以被 26 整除的,只有最后一位是小于 26 是不能整除的。说白了,这就是个进制转换问题,26 进制的转换!!!将 2022 转换为 26 进制,不过位码变成了 A~Z 的 26 个大写字母了!!!蠢哭了
AI 解题来源:通义灵码
存档地址:https://www.yuque.com/worthstudy/study/rgybkaxd35bxyony
暂无评论内容