【藍橋杯】【Excel地址轉換】
【題目】
Excel是最常用的辦公軟體。每個單元格都有唯一的地址表示。比如:第12行第4列表示為:“D12”,第5行第255列表示為“IU5”。
事實上,Excel提供了兩種地址表示方法,還有一種表示法叫做RC格式地址。
第12行第4列表示為:“R12C4”,第5行第255列表示為“R5C255”。
你的任務是:編寫程式,實現從RC地址格式到常規地址格式的轉換。
【輸入、輸出格式要求】
使用者先輸入一個整數n(n<100),表示接下來有n行輸入資料。
接著輸入的n行資料是RC格式的Excel單元格地址表示法。
程式則輸出n行資料,每行是轉換後的常規地址表示法。
例如:使用者輸入:
2
R12C4
R5C255
則程式應該輸出:
D12
IU5
【分析】
通過分析不難發現,問題的關鍵在於如何將列號碼轉換成字母,現在需要發現規律:
ABCDEFGHIJKLMNOPQRSTUVWXYZ 共26個英文字母
A~Z 1~26
AA~AZ 27~52
BA~BZ 53~78
…
HA~HZ 209~234
IA~IU 235~255
看實際的情況分析規律,假設列的號碼是C:
1、如果C%26 == 0,再判斷C/26的情況
2、如果C%26 != 0,再判斷C/26的情況
【原始碼】
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int line = sc.nextInt();
ArrayList<Cell> cellList = new ArrayList<Cell>();
//用List集合儲存所有的RC物件
for(int i=0; i<line; i++){
String s = sc.next();
int r = s.indexOf('R');
int c = s.indexOf('C');
int row = Integer.valueOf(s.substring(r+1, c));
int column = Integer.valueOf(s.substring(c+1));
Cell cell = new Cell(row, column);
cellList.add(cell);
}
sc.close();
String s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] c1 = s1.toCharArray();
for(int i=0; i<line; i++){
//sb代表列的英文字元編號
StringBuilder sb = new StringBuilder();
Cell cell = cellList.get(i);
int row = cell.getRow();
int column = cell.getCloumn();
int x = column % 26; //列號對26取模
int y = column / 26; //列號除以26
if(x == 0){
if(y == 1){
}else{
sb.append(c1[y-2]);
}
sb.append('Z');
}else{
if(y == 0){
}else{
sb.append(c1[y-1]);
}
sb.append(c1[x-1]);
}
sb.append(row);
System.out.println(sb);
}
}
//代表Excel的一個單元格
private static class Cell{
private int row;
private int cloumn;
public Cell(int row, int column){
this.row = row;
this.cloumn = column;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getCloumn() {
return cloumn;
}
public void setCloumn(int cloumn) {
this.cloumn = cloumn;
}
}