题目
Excel地址
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
Excel单元格的地址表示很有趣,它使用字母来表示列号。
比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
…
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目即是要求对输入的数字, 输出其对应的Excel地址表示方式。
内容:
易错点:
这里并不是传统的26进制,因为在excel表格中表示不了0
eg:676 = 25*26+ 26 ---->YZ
677----------------->ZA
所以核心就是判断位数:
核心代码:
def calculate(num):
count = 1
temp = num
judge = 26
while temp>judge:
count += 1
judge += 26 ** count
print(judge)
return count
判断区间是:26
26^2+26
26^3 + 26^2+26
完整代码:
#excel 表格并不是26进制,因为没有0
#所以用余数就是做不出来的
#输入
num = int(input())
#先计算需要多少位去表示这个数字
#677只需要两位 ZA
def calculate(num):
count = 1
temp = num
judge = 26
while temp>judge:
count += 1
judge += 26 ** count
print(judge)
return count
def add(num):
count = calculate(num)
reverse_outcome = ''
#这里就把num一位一位算出来就行了
for i in range(count):
remainder = num % 26
if remainder == 0:
reverse_outcome += 'Z'
#处理数据
num = (num - 26)/26
else:
reverse_outcome += chr(ord('A') + int(remainder) - 1)
#处理数据
num = (num - remainder)/26
return reverse_outcome
def reverse(outcome_reverse):
temp = ''
length = len(outcome_reverse)
for i in range(length):
temp += outcome_reverse[length - i-1]
return temp
print(reverse(add(num)))
这个方法很笨,后来在网络上看到了别人的代码,简洁的多
网络上更加简洁的代码
import os
import sys
# 请在此输入您的代码
n=int(input())
ans=[]
while n!=0:
if n%26==0:
ans.append(26)
n=n//26-1
else:
ans.append(n%26)
n=n//26
for i in range(len(ans)):
print(chr(ans[len(ans)-i-1]+64),end='')
读完别人的代码,想起之前读到过的话:数学能力才是我们解决这些问题的本质。代码只是工具
因为没有0,所以只要整除就加上个Z,上一个的asc2值减掉一个1就行了。
同时,可以使用python中强大的list类,就不用字符串,也用不着reverse咯。