题意:
将R23C55(第23行55列)转换成另一种表达形式BC23,即将行用字母表示,A到Z(26位),下一位为AA(27),再例如BZ(2*26+26=78)。
以及将形如BC23转换成R23C55。
思路:
模拟一发即可。要注意判断到底是Excel转换成RXCY还是RXCY转换成Excel,不可以单纯的判断首字母为R,第二个字母为数字,就断定为是将RXCY转换成Excel格式。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
const int MAXN = 1e6 + 10;
int len;
char str[MAXN];
void one(){
int pos, a=0, b=0;
for(int i=0; i<len; ++i){
if(str[i]=='C') {
pos = i;
break;
}
}
for(int i=1; i<pos; ++i){
a = a*10+(str[i]-'0');
}
for(int i=pos+1; i<len; ++i){
b = b*10+(str[i]-'0');
}
stack<char> s;
while(b>0){
if(b%26==0){
s.push('Z');
b -= 26;
}
else
s.push('A'-1+b%26);
b/=26;
}
while(!s.empty()){
printf("%c", s.top());
s.pop();
}
printf("%d\n", a);
}
void two(){
int pos;
for(int i=0; i<len; ++i){
if(isdigit(str[i])){
pos = i; break;
}
}
int num = 0;
for(int i=0; i<pos-1; ++i){
num = num*26 + (str[i]-'A'+1)*26;
}
num += str[pos-1]-'A';
printf("R");
for(int i=pos; i<len; ++i) printf("%c", str[i]);
printf("C%d\n", num+1);
}
int main(){
int n;
scanf("%d", &n);
while(n--){
getchar();
scanf("%s", str);
len = strlen(str);
bool aa = false;
bool bb = false;
for(int i=0; i<len; ++i){
if(isdigit(str[i])) aa = true;
if(aa && isalpha(str[i])){
bb = true; break;
}
}
if(bb)
one();
else
two();
}
return 0;
}