Spreadsheets

来源:互联网 发布:视频播放器软件 编辑:程序博客网 时间:2024/06/05 15:55

Description

  在一些知名的表格处理系统中(比如:excel表格),我们经常用大写的字母来表示列,例如A表示第1列,B表示第2列,第26列用Z来表示,同时第27列我们用AA来表示,第28列我们用AB来表示,第29列我们用AC来表示,AZ表示第52列,ZZ之后我们就需要用3个字母来表示列了。
  行的表示比较简单,我们一般用正整数来表示,比如1就表示第1行,5就表示第5行,行和列一起表示成为类似BC23的情况,这个表示在第23行,第55列。
  有时候,我们的系统也会用RXCY的格式来表示,X和Y是整数,分别表示行号和列号。例如:R23C55表示的位置和之前那个例子是一样的。
  你的任务是写一个程序,将这些位置在两种不同的表示方法之间转化。

Input

第一行是一个正整数n(1<=n<=10^5), 表示测试数据的数量。
接下来n行,每行一串字符,表示一个位置,输入保证所有的位置都是正确的,没有一个位置的行号或者列号超过10^6。

Output

输出n行,每行是对应的位置的转化结果。

Sample Input

2
R23C55
BC23

Sample Output

BC23
R23C55



code:

#include <iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;

string s;
int n;
char word[27];

void f(){
    //R23C55
    int i,j=0,num1=0,num2=0;
    for(i=1;i<n;i++){
        if(s[i]>='A'&&s[i]<='Z')
            break;
        num1=num1*10+s[i]-'0';
    }
    for(i++;i<n;i++){
        num2=num2*10+s[i]-'0';
    }
    int mark[100000];
    while(num2){
        if(num2 % 26 !=0){
            mark[j++]=num2%26;
            num2=num2/26;
        }else{
            mark[j++]=26;
            num2=num2/26-1;
        }
    }
    for(i=j-1;i>=0;i--)
        cout<<word[mark[i]];
    cout<<num1<<endl;

}
void ff(){
    int i,num1=0,num2=0;
    for(i=0;i<n;i++){
        if(s[i]>='0'&&s[i]<='9')
            break;
        num1=num1*26+s[i]-'A'+1;
    }
    for(;i<n;i++){
        num2=num2*10+s[i]-'0';
    }
    cout<<"R"<<num2<<"C"<<num1<<endl;
}

int main(){
    //BC23
    freopen("input.txt","r",stdin);
    word[1]='A';
    for(int i=2;i<=26;i++)
        word[i]=word[i-1]+1;
    int t,flag;
    cin>>t;
    while(t--){
        cin>>s;
        n=s.size();
        flag=0;
        for(int i=0;i<n-1;i++){
            if(s[i]>='0'&&s[i]<='9' &&s[i+1]>='A'&&s[i+1]<='z'){
                flag=1;
                break;
            }
        }
        if(flag==1)
            f();
        else
            ff();
    }

}



0 0