解题思路:
根据题中歪歪和笨笨的话可以有两种解法。
1.输入的数为多大,则循环+1多少次,当值为27时就要进行进位操作。这时要分情况讨论。
当集合中元素为一个时,如26,则需要变为1 1,集合元素个数加一。
当集合元素个数大于1时,当首位不为26,如1 2 3 26 26 ,变为1 2 4 1 1,
倒着循环,不为26的第一个元素位置数值+1,其后面的数值都为1.
当首位为26时,如 26 26,变为 1 1 1,集合元素个数加一,
所有元素变为1
在根据ASCII码对照关系,进行赋值转换。
2.当作二十六进制来做,注意的是余数为0时,即为字母Z,余数从0变为26,除数-1。
如 52 AZ 52/26=2....0=1...26 1/26=0.....1 1 26对应AZ
解题代码:
public class Exceldizhi {
//BZZ 2054
//AA 27
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
for (int i = 1; i <= n; i++) {
int num = list.get(list.size() - 1) + 1;
if (num <= 26) { // 末尾<26
list.set(list.size() - 1, num);
} else {//大于26则进位
boolean isfirst26 = true;
if (list.size() == 1) {//集合中只有一个元素 例如26变为 1 1
list.add(0, 1);
list.set(1, 1);
} else {
for (int j = list.size() - 2; j >= 0; j--) {//例如1 2 26 26 26 变为1 3 1 1 1
if (list.get(j) < 26) {
list.set(j, list.get(j) + 1);
for (int k = j + 1; k < list.size(); k++) {
list.set(k, 1);
}
isfirst26 = false;
break;
}
}
if (isfirst26) {//集合中首位元素为26,例如 26 26 变为1 1 1
list.add(0, 1);
for (int m = 1; m < list.size(); m++) {
list.set(m, 1);
}
}
}
}
}
String str = "";
for (int i = 0; i < list.size(); i++) {
str += (char) (list.get(i) + 64);
}
System.out.println(str);
}
}
public static void main(String[] args) {
//2054 2054/26=79...0 79/26=3...1 3/26=0...3 310
//26 26/26=1...0
//20 20/26=0...20
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
ArrayList<Integer> list = new ArrayList<Integer>();
while(true) {
int mod=(int)(n%26);
if(mod==0) {
list.add(26);
n--;
}else {
list.add(mod);
}
n=n/26;
if(n==0)
break;
}
String str="";
for(int i=list.size()-1;i>=0;i--) {
str+=(char)(list.get(i)+64);
}
System.out.println(str);
}