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位,所以和以往的进制转换略有不同。
- ①将A,AA,AAA,AAAA表示的十进制数都存在数组val[]中,由于其增大的速度非常快,所以只需要存取几个元素。
- ②将各个位上每加1代表的数组也存在数组div[]中(26,262,263…)
- 将要表达的数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--;
}
}
}
思路二
- 由于是进制转换,可以先将其写出来:n = (An)26^n + (An-1)26^(n-1) … + A226^2 + A126 + A0*1
- 可知,只要减去最后一位,其余的和可以整除26,即最后一位 = n % 26
- 所以可以依次进行此操作:
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)));
}