就是熟悉一下分类讨论和string转int,唯一的难度在于关于 'Z' 的讨论,发现其实进制还是26进制,不过这里没有0反而有26,那就每次 C%26==0 时手动分离一个 'Z' 出来就好了。
注意一下行和列别搞反,cin.tie(0) 对cout的影响(未解决),substr方法的两个参数分别是begin和length即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
string s;
int type1(int FN){
//BC23
string s1,s2;
s1=s.substr(0,FN);
s2=s.substr(FN,s.length()-FN);
ll C=0;
int l1=FN;
for(int i=0;i<FN;i++){
C*=1LL*26;
C+=s[i]-'A'+1;
}
cout<<"R"<<s2<<"C"<<C<<"\n";
return 0;
}
int type2(int SA){
//R23C55
string s1,s2;
s1=s.substr(1,SA-1);
s2=s.substr(SA+1,s.length()-SA+1);
stringstream sin2(s2);
ll C;
sin2>>C;
string res;
while(C){
if(C%26==0){
res='Z'+res;
C/=26;
C--;
}
else{
res=(char)('A'-1+C%26)+res;
C/=26;
}
}
cout<<res<<s1<<"\n";
return 0;
}
int findFirstNum(){
for(int i=1;;i++){
if(s[i]>='0'&&s[i]<='9')
return i;
}
}
int findSecondAlpha(int FN){
int l=s.length();
for(int i=FN+1;i<l;i++){
if(s[i]>='A'&&s[i]<='Z')
return i;
}
return -1;
}
int solution(){
cin>>s;
int FN=findFirstNum();
int SA=findSecondAlpha(FN);
if(SA==-1)
return type1(FN);
else
return type2(SA);
}
int main() {
cin.sync_with_stdio(false);
//cin.tie(nullptr);
while(cin>>n){
while(n--)
int res=solution();
}
return 0;
}