【编程题】(满分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

结题思路:字符串处理,26进制转换。特别注意26要被转换成Z,因为A表示的是1而不是0。
代码如下:
(代码实现了两种格式的互换问题)

import java.util.*;


public class Main {
    
    
    
static int N;
    
static String instr1;
    
public static void main(String[] args)
    
{
        Scanner sc 
= new Scanner(System.in);
        N 
= sc.nextInt();
        sc.nextLine();
        
for(int i = 0; i < N; i++){
            instr1 
= sc.nextLine();
            
if(isRC(instr1)){
                toAN();
            }

            
else{
                toRC();
            }

        }

        
    }

    
static void toRC(){
        
/*
         * D12-->R12C4
         
*/

        
int i = 0;
        
int numc = 0;
        
while(Character.isLetter(instr1.charAt(i))){
            numc 
*= 26;
            numc 
+= instr1.charAt(i) - 'A' + 1;
            i
++;
        }

        
int numr = Integer.parseInt(instr1.substring(i));
        System.out.println(
"R" + numr + "C" + numc);
    }

    
static void toAN(){
        
/*
         * R12C4-->D12
         
*/

        StringBuffer sbuf 
= new StringBuffer();
        String[] strs 
= instr1.split("[RC]");//正则式很有趣
        int numc = Integer.parseInt(strs[2]);
        
while(numc > 0){
            
char c = (char)((numc - 1% 26 + 'A');//num - 1,避免26被转换为A
            sbuf.append(c);
            numc 
= (numc - 1/ 26;//num - 1,避免26被转换为AZ
        }

        System.out.println(sbuf.reverse() 
+ strs[1]);
    }

    
    
static boolean isRC(String instr){
        
int count = 0;
        
boolean isnumbg = false;
        
for(int i = 0; i < instr.length(); ){
            
if(Character.isDigit(instr.charAt(i))){
                
if(isnumbg){
                    i
++;
                }

                
else{
                    isnumbg 
= true;
                    count
++;
                    i
++;
                }

            }

            
else{
                
if(isnumbg){
                    isnumbg 
= false;
                }

                i
++;
            }

        }

        
if(count == 2)
            
return true;
        
return false;
    }

        
}


 

posted on 2013-07-07 20:27 小鼠标 阅读(454) 评论(0)  编辑 收藏 引用 所属分类: Java基础练习

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

随笔分类(111)

随笔档案(127)

friends

最新评论

  • 1. re: 线段树
  • 是这个样子的,所以在OJ有时候“卡住”了也不要太灰心,没准真的不是自己的原因呢。
    加油,祝你好运啦!
  • --小鼠标
  • 2. re: 线段树
  • 对于编程竞赛来说,Java所需时间一般为C/C++的两倍。合理的竞赛给Java的时间限制是给C/C++的两倍。
  • --伤心的笔
  • 3. re: poj1273--网络流
  • 过来看看你。
  • --achiberx
  • 4. re: (转)ubuntu11.10无法启动无线网络的解决方法
  • 膜拜大神。。查了一个下午资料终于在这里解决了问题。。神牛说的区域赛难道是ACM区域赛。。?
  • --Hang
  • 5. re: 快速排序、线性时间选择
  • 博主,谢谢你的文章。你的方法可以很好的处理分区基准在数组中重复的情况,书上的方法遇到这种输入会堆栈溢出。书上给出了解释但给的方法貌似不简洁。
  • --lsxqw2004

阅读排行榜