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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值