2020.12.28Excel(数字到BZZ)

2020.12.28Excel(数字到BZZ)

题目描述

Excel单元格的地址表示很有趣,它使用字母来表示列号。比如:

A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列

本题目即是要求对输入的数字, 输出其对应的Excel地址表示方式。

样例输入

26

样例输出

Z

样例输入

2054

样例输出

BZZ

思路 & 代码

思路一

由于A表示1,且其中没有0位,所以和以往的进制转换略有不同。

  1. ①将A,AA,AAA,AAAA表示的十进制数都存在数组val[]中,由于其增大的速度非常快,所以只需要存取几个元素。
  2. ②将各个位上每加1代表的数组也存在数组div[]中(26,262,263…)
  3. 将要表达的数n与之依次进行比较,找到比它小的数中最大的一个(第i个),减去它,再除以div[]对应的元素,得第i位要加的位数。依次进行此操作。

代码一

    void test() {
        Scanner input = new Scanner(System.in);
        long n = input.nextLong();
        long[] val = new long[8];
        long[] div = new long[8];
        long s = 0;
        for(int i = 0; i < val.length; i++) {
            div[i] = (long) Math.pow(26, i);
            s+= div[i];
            val[i] = s;
        }
        for(int i = val.length-1; i >= 0; i--) {
            if(val[i] > n) continue; //找到val中的元素比n小
            while(n>0) {
                long z = n - val[i];
                int d = (int) (z/div[i]);
                n = n - (1+d)*div[i];
                System.out.print((char)('A' + d));
                i--;
            }
        }
    }

思路二

  1. 由于是进制转换,可以先将其写出来:n = (An)26^n + (An-1)26^(n-1) … + A226^2 + A126 + A0*1
  2. 可知,只要减去最后一位,其余的和可以整除26,即最后一位 = n % 26
  3. 所以可以依次进行此操作:
    x = n % 26 //得到最后一位
    n = (n-x)/26 //将最后一位去除,倒数第二位变成最后一位。

代码二

	void test() {
		Scanner input = new Scanner(System.in);
		long n = input.nextLong();
		ArrayList<Integer> yu = new ArrayList<Integer>();
		while(n != 0) {
			int x = (int)(n %26);
			if(x == 0) x = 26;
			yu.add(x);
			n = (n-x)/26;
		}
		for(int i = yu.size()-1; i >=0; i--) 
			System.out.print((char)('A'-1+yu.get(i)));
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值