Excel地址——蓝桥杯真题Python

在这里插入图片描述

题目分析

Excel 的列地址表示法本质上是一个特殊的“26进制”系统,但与我们熟悉的常规进制有以下关键区别:

  • 没有零 (0) 的存在:数字范围是 1-26,对应字母 A-Z(而非 0-25)。这意味着当遇到余数为 0 时(即能被 26 整除的情况),需要特殊处理。
  • 高位在前,低位在后:例如 26 → Z27 → AA28 → AB,这与常规进制的高位权重顺序一致,但字符拼接顺序需要注意。

算法思路

  1. 循环取余与调整

    • 每次循环中,计算当前数值 n 对 26 的余数 temp
    • 若余数 temp > 0,则直接将其转换为对应字母(temp-1 作为索引)。
    • 若余数 temp == 0,说明当前位应取 Z(对应索引 25),同时需要将商 n 减 1 以修正进位(因为 26 的倍数在该系统中代表一个完整的“位”)。
  2. 反向拼接字符

    • 每次将新得到的字符添加到结果字符串的前面,确保高位字符在左侧。
  3. 终止条件

    • n 被除至 0 时,循环结束。

代码实现

import os
import sys
def main():
  n = int(input())
  string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  result = ''
  while n > 0:
    temp = n%26
    # 这里考虑余数为0,即26Z的情况下,应该是添加string[25]Z而不是string[0]A
    if temp > 0:
      # 这里拼接方向可以多通过例子去判断
      result = string[temp-1]+result
      n = n//26 # 一般情况下直接进行整除,但若是26整除完还是1啊,还会进行下一次循环,因此余数为0得进行特殊处理
    else :
      result = string[25]+result
      n = n//26
      n -= 1 # 当余数为0时,整除完再减一
  print(result)
if __name__ == "__main__":
  main()

示例解析

以输入 n = 52 为例,逐步分析流程:

  1. 初始状态n = 52, result = ""
  2. 第一次循环
    • temp = 52 % 26 = 0
    • 进入 else 分支:
      • result = "Z" + "" → "Z"
      • n = 52 // 26 = 2, 再减 1 → n = 1
  3. 第二次循环
    • temp = 1 % 26 = 1
    • 进入 if 分支:
      • result = "A" + "Z" → "AZ"
      • n = 1 // 26 = 0,循环结束
  4. 输出结果AZ

复杂度分析

  • 时间复杂度:O(log₂₆(n))。每次循环将 n 除以 26,循环次数与 n 的位数成正比。
  • 空间复杂度:O(log₂₆(n))。结果字符串的长度由输入数字的位数决定。

关键点总结

  • 余数为零的处理:当余数为 0 时,代表该位为 Z,且需要手动调整商的值(n = n // 26 - 1)。
  • 字符拼接顺序:每次将新字符添加到结果字符串的前端,确保高位字符在前。
  • 边界条件验证:例如 n = 26 应输出 Zn = 702 应输出 ZZ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值