1. 程式人生 > >Excel地址轉換 Excel是最常用的辦公軟體。每個單元格都有唯一的地址表示。 比如:第12行第4列表示為:“D12”,第5行第255列表示為“IU5”。

Excel地址轉換 Excel是最常用的辦公軟體。每個單元格都有唯一的地址表示。 比如:第12行第4列表示為:“D12”,第5行第255列表示為“IU5”。

/*Excel地址轉換
【程式設計題】(滿分21分)
    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
 */
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo03 {
	// 計算出字母的個數
	public static int checkCount(int n){
		int count = 1;
		while(true){
			int t = (int)Math.pow(26, count);
			if(n > t){
				count++;
				n -=  t;
			}else{
				return count;
			}
		}
	}
	// 新增餘數對應的字母
	public static char f(int n){
		if(n==26){
			return 'Z';
		}else{
			return (char)('A'-1+n%26);
		}
	}
	// 計算結果
	public static String fun(int Row,int Col){
		StringBuffer sb = new StringBuffer();
		int count = checkCount(Col);	// 計算出字母的個數
		while(count>0){
			if(Col%26==0){	//如果能除盡
				// 例(702):702/26時(2餘0) 應該分配成(1,26)
				// 個位 加26('Z')時  就等於 十位上的2 去掉(1個26),(一個(個位的26)對應一個(十位的1)) 
				// 修改n的值  2-1; n就等於1; 這時就分配成了(1,26);
				sb.insert(0,'Z');	// 新增'Z'
				Col = Col/26 -1;	
			}else{
				sb.insert(0,f(Col));// 新增餘數r對應的字母
				Col /= 26;	// 修改 n 的值
			}
			count--;
		}
		sb.append(Row);	// RC地址後新增(行號)
		return sb.toString();
	}
	// 輸入資料
	public static void input(String[] s){
		Scanner scan = new Scanner(System.in);
		int i = 0;
		while(i<s.length){	// 輸入n個數據
			s[i++] = scan.nextLine();
		}
	}
	// 拆分並計算結果
	public static void splitOper(String[] s){
		Pattern p = Pattern.compile("[0-9]+");	// 以數字做分隔
		for(int i=0;i<s.length;i++){
			Matcher m = p.matcher(s[i]);	// 得到所有數字
			m.find();	// 得到第一個數字
			int Row = Integer.parseInt(m.group());	// 取出第一個數字
			m.find();	// 得到第二個數字
			int Col = Integer.parseInt(m.group());	// 取出第二個數字
			System.out.println(fun(Row,Col));	// 計算結果並輸出
		}
	}
	// 主函式
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		System.out.println("輸入一個整數n(n<100)");
		String[] s = new String[scan.nextInt()];
		input(s);	// 輸入資料
		splitOper(s);	// 拆分並計算結果
	}
}
執行結果:
輸入一個整數n(n<100)
2
R12C4
R5C255
D12
IU5