codeforces 1B.Spreadsheets
传送门:https://codeforces.com/problemset/problem/1/B
题目大意:
同一个坐标采用两种不同中的表示方式,其中一种为RxCy其中x为行,y为列;另一种为大写字母(A~Z(分别表示26进制里的0到25)与c语言中数组相同,从A开始计数)后面拉一串数字(从1开始计数),字母表示列,数字表示行。要求进行两种表示方式的转换。
主要思路:
首先,我们得先判断它到底是哪一种表示方式,于是,我们找出两种方式的不同为前者一定是有开头是R,后面有数字,但这个特征不明显,因为后者也有这种可能,但只有前者会在数字后面还接上一个C。好了,把它们区分开后就好办了,只要进行一个进制转换的工作就可以了。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j,p;
char a[500];
cin >>n;
for(i=0;i<n;i++)
{
cin >>a;
int p=strlen(a),k=0;
if(a[0]=='R'&&a[1]<'A')
{
for(j=2;j<p;j++)
{
if(a[j]=='C')
{
k++;
break;
}
}
}
if(k==0)
{
int l=0,m=0;
for(j=0;a[j]>58;j++)
{
l*=26;
l+=(a[j]-64);
}
for(;j<p;j++)
{
m*=10;
m+=(a[j]-48);
}
cout <<'R'<<m<<'C'<<l<<endl;
}
else
{
int l=0,m=0;
char q[500];
for(j=1;a[j]!='C';++j)
{
l*=10;
l+=(a[j]-48);
}
++j;
for(;j<p;++j)
{
m*=10;
m+=(a[j]-48);
}
for(j=0;m!=0;j++)
{
m-=1;
q[j]=m%26+65;
m/=26;
}
--j;
for(;j>=0;--j)cout <<q[j];
cout <<l<<endl;
}
}
return 0;
}