这题目感觉就是考数学找规律的。。找的出规律自然就可以解了,下面来讲下我的思考过程。
先上题目:
Excel地址
Excel单元格的地址表示很有趣,它使用字母来表示列号,比如:
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
….
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。
例如,
输入:
26
则程序应该输出:
Z
再例如,
输入:
2054
则程序应该输出:
BZZ
我们约定,输入的整数范围[1,2147483647]
一开始,我想用进制转换的方式来做,但是推算到后面发现不行。。想了许久,决定从结果逆推出其规律。
如题目中测试用例 ↓
输入:2054 输出: BZZ。
我们将十进制转化成二进制一般可以这样做:
由此我们大胆地将2054和BZZ写成这样:
那上面3个问号里的值是什么呢?最后一个问号里值为0,因为在上面二进制转换求余数时如果商为0即代表结束,不再求余。
所以第二问号的值可得 0 * 26 + 2 = 2
第三个问号的值可得 2 * 26 + 26 = 78
所以最终结果为:
从上图中我们可以发现这样的一个规律:
当整数n可被26整除时(即n%26==0),可以看作先将 n-26 再除以26,这样就可以得到一个余数26。
所以,对应的代码随即产生了!
import java.util.Scanner;
import java.util.Stack;
public class Excel地址 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Stack<Integer> stack = new Stack();
/*核心部分 Start*/
while(n!=0){
if(n%26==0) n-=26;
stack.push(n%26==0?26:n%26);
n/=26;
}
/*核心部分 End*/
while (!stack.isEmpty())
System.out.print((char)('A'+stack.pop().intValue()-1));
sc.close();
}
}
下面对核心部分代码进行讲解:
当整数n不等于0时进入循环体后,首先判断n是否被能被26整除,若能则将n-26。接着将余数塞入
(未完待续)