CF 1B

模拟进制,但要注意字母并不完全是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");


    
}
 

猜你喜欢

转载自blog.csdn.net/haobang866/article/details/114580757