模拟进制,但要注意字母并不完全是26进制,可以发现第n位和第n-1位有可能是等值的 A0=Z,所以从个位开始转十进制数字的时候特判Z,遇到Z写0,并向高位进一。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,a,ans,ans2;
int i,j,k;
char iptch[999];
char ansch[99];
int anschlen;
void num2a(int o)
{int i;
anschlen=0;
while(o)
{//printf(",,%d,, ",o);
if(o%26==0)
{ansch[++anschlen]='Z';
o-=26;
} else
{
ansch[++anschlen]='A'+(o%26)-1;
// printf("qq%dpp%dpp",o,(o%26));
}
o/=26;
}
}
int main()
{
scanf("%lld",&n);
while(n--)
{
scanf("%s",iptch+1);
m=strlen(iptch+1);
bool isrc=false;
int bj=0;
int bj2=0;
for (i=2;i<=m;i++)//判断类型
{
if( iptch[i]>='A'&&iptch[i]<='Z'&&iptch[i-1]>='0'&&iptch[i-1]<='9'){isrc=true;bj=i-1;}
if( iptch[i-1]>='A'&&iptch[i-1]<='Z'&&iptch[i]>='0'&&iptch[i]<='9'){bj2=i-1;}
}
if(isrc)
{//get shi
ans=0;
for(i=2;i<=bj;i++)
ans=ans*10+iptch[i]-'0';
ans2=0;
for(i=bj+2;i<=m;i++)
ans2=ans2*10+iptch[i]-'0';
// printf(",,%lld,, ",ans2);
num2a(ans2);
for(i=anschlen;i>=1;i--)
{
printf("%c",ansch[i]);
}
printf("%lld",ans);
}else
{
ans=0;
for(i=1;i<=bj2;i++)
ans=ans*26+(iptch[i]-'A'+1);
ans2=0;
for(i=bj2+1;i<=m;i++)
ans2=ans2*10+iptch[i]-'0';
printf("R%lldC%lld",ans2,ans);
}
printf("\n");
}
}