Prev41 历届试题 Excel地址
题目如下:
这道题目其实让我挺难忘的,因为我在参加第十届的时候就碰到了这个题,当时是道填空题。庆幸的是参加比赛前做了这道题目
没啥好说的,这题其实让人很有用进制做的想法,但这个又不能当成26进制来写,有些点说不通的,所以我就还是暴力模拟了
代码和注释如下:
import java.util.Scanner;
/**
* @Description: 历届试题 Excel地址
* @ClassName: Prev41
* @author: fan.yang
* @date: 2020/12/22 09:43
*/
public class Prev41 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = 1;
int m = 0;
int a[] = new int[7];
//求得A AA AAA AAAA AAAAA AAAAAA... 的数值
//这里说明一下之所以求A AA... 是为了确定输入的值的大概的范围
//比如例子2054就是介于AAA和AAAA之间 这样我就知道2054是由3个字符构成
//循环7次差不多了 AAAAAAA等于321272407 再下去int就爆了
for(int i = 0;i < 7;i++){
a[i] = k;
if(i != 0){
a[i] += a[i - 1];
}
//到循环结束就能得到
if(n / a[i] > 0){
m = i;
}
k *= 26;
}
//根据求得的m进行计算
//比如n = 2054时 当我们知道他是3位的时 那其构成就是 26的2次 * X2 + 26的1次 * X1 + 26的0次 * X0 (很像进制)
//X的值就由A B C ... Z来代替 最终得到 X2 = B ,X1 = Z ,X0 = Z 合起来就是BZZ
for(int i = m;i >= 0;i--){
//得到X的值
int pow = (int)Math.pow(26, i);
int x = n / pow;
//这里注意一下X的值可能有问题
//比如2054 / 26的2次 得到 3
//但如果x的值取3 那么后面两位只需要构建 2054 - 26 * 26 * 3 = 26 那么后两位就是A0 或者 0Z 这显然是不行的
//后面两位一定要大于等于AA 因为A代表1 没有存在0的情况 所以AA是后两位最小的情况 只能大于等于AA
// 所以我们要减1 将这个多出来的值留个后两位来构成
if(i != 0 && n - x * pow < a[i - 1]){
x--;
}
System.out.print((char)('A' + (x - 1)));
//减去当前循环构建的
n -= x * pow;
}
}
}