思特奇杯·云上蓝桥 -算法 集训营第一周-8.excel 地址

题目描述

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);

	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值