在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母,依次为 A 到 Z,接下来 26*26 列使用两个字母的组合,依次为 AA 到 ZZ

此题为第十五届蓝桥杯模拟赛(第一期)Python赛道的第二道 填空题

题目描述

在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母,依次为 A 到 Z,接下来 26*26 列使用两个字母的组合,依次为 AA 到 ZZ。

请问第 2022 列的名称是什么?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个由大写字母组成的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

我的解题

分析

解决这道题不难,由于是填空题,所以为了节约时间最好,但是事后还是得想办法整个算法来计算这个结果。

现在进入分析:

  1. A~Z:26
  2. A*A~Z*Z:676
  3. A*A*A~Z*Z*Z:17576
  4. 显然 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(错)。
  5. 后面发现问题后,这其实是个进制转换问题!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

© 版权声明
THE END
喜欢就点赞支持一下吧,如果觉得不错或日后有所需要,可以收藏文章和关注作者哦。
点赞2打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容