题目描述
Excel单元格的地址表示很有趣,它使用字母来表示列号。
比如,A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,....
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。
比如,A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,....
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。
输入
输入存在多组测试数据,对于每组测试数据输入一行包含一个整数
输入的整数范围[1,2147483647]
输入的整数范围[1,2147483647]
输出
对于每组测试数据:输出一行表示答案
样例输入 Copy
26
2054
样例输出 Copy
Z
BZZ
我怎么变菜了,这种题居然做不出,还要搜题解。看来还是要做点真题,不然比赛要翻车啊。记录一下。
思路:很像进制又有所不同,没有0,取值是1-26,十进制取值是0-9,在n%26==0时,末尾补Z,然后n减1以抵消最后的Z
import java.util.*; public class Main{ public static void main(String []args){ Scanner scan=new Scanner(System.in); char[]s=new char[100]; int cnt=0; while(scan.hasNext()) { cnt=0; int n=scan.nextInt(); while(n!=0) { if(n%26==0) {//末位必然是Z s[cnt]='Z'; cnt++; n=n/26; n--;//例如n=52,n=52/26=2,然而是AZ,减去末位的一份26 }else { int r=n%26; s[cnt]=(char)('A'-1+r); cnt++; n=n/26;//例如28,AB,r=28%26=2,n=28/26=1 } } for(int i=cnt-1;i>=0;i--) System.out.print(s[i]); System.out.println(); } } }
天上不会掉馅饼,努力奋斗才能梦想成真。