1. 程式人生 > >【藍橋杯】【Excel地址轉換】

【藍橋杯】【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; } }