题目描述
Exce濿 单元格的地址表示很有趣,它使用字母来表示列号。
比如,
A 表示第 1 列,
B 表示第 2 列,
Z 表示第 26 列,
AA 表示第 27 列,
AB 表示第 28 列,
BA 表示第 53 列,
…
当然 Exce濿 的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列
呢?
本题目即是要求对输入的数字, 输出其对应的 Exce濿 地址表示方式。
解法一
解题思路
该题本质上就是进制转换相当于将十进制转换为26进制,A~Z代表1~26,但这个进制又不完全是26进制,该进制没有表示0的存在,且到了27才会进一位,26继续用Z表示
创建字典{0: '', 1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G', 8: 'H', 9: 'I', 10: 'J', 11: 'K', 12: 'L', 13: 'M', 14: 'N', 15: 'O', 16: 'P', 17: 'Q', 18: 'R', 19: 'S', 20: 'T', 21: 'U', 22: 'V', 23: 'W', 24: 'X', 25: 'Y', 26: 'Z'}
ABZ 可转换为十进制为 1*26**2 + 2*26**1 + 26*26**0 = 754
754转换为ABZ流程如下
s = ''
754 = (1*26**2 + 2*26**1 + 26*26**0) % 26 = 0 == 0 #注意这里没有进位
s = s + d[26] = s + 'Z'
754 // 26 = 29 = (1*26**1 + 2) % 26 = 2 != 0
s = s + d[2] = s + 'B'
29// 26 = 1 % 26 = 1 != 0
s = s + d[1] = s + 'A'
故求得s = 'ZBA'
逆转s得‘ABZ'即转换成功
python代码
#excel 地址
def solution(num):
s = ''
d = {0:''}
for i in range(65,91):
d[i-64] = chr(i)
while num >= 26:
r = num % 26
if r == 0:
s += d[26]
num = num // 26 - 1
else:
s += d[r]
num = num // 26
s += d[num]
return s[::-1]
if __name__ == '__main__':
num = int(input())
ans = solution(num)
print(ans)
运行结果
java代码
import java.util.Scanner;
/*excel 地址*/
public class homework08 {
private static String solution(int num) {
String s = "";
String[] d = {"","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
int r;
while (num >= 26) {
r = num % 26;
if (r == 0) {
s = d[26]+s;
num = num / 26 - 1;
}
else {
s = d[r] + s;
num = num / 26;
}
}
s = d[num] + s;
return s;
}
public static void main(String[] args) {
int num;
System.out.println("请输入一个整数:");
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
sc.close();
String s = solution(num);
System.out.println(s);
}
}