题目链接: http://codeforces.com/problemset/problem/1/B
题意:给出两种行列位置的表示方法,一个是Excel表示法,一个是(R,C)坐标表示。
给出一种表示,输出另外一种表示。
题解:进制转换的变形
- 从Excel转换为(R,C),类似如26进制转换为10进制
- 从(R,C)转换为Excel,类似如10进制转换为26进制
#include<cstdio>
#include<cstring>
char s[110000];
char word[30];
void slove1()
{
int len = strlen(s);
int num1 = 0 ,num2 = 0;
int i = 1;
while(s[i] >= '0' && s[i] <= '9')
{
num2 = num2*10 + s[i] - '0';
i++;
}
for(i++;i < len; i++)
num1 = num1*10+ s[i]-'0';
int temp[10000], cnt = 0;;
while(num1)
{
if(num1 % 26 == 0) {temp[cnt++] = 26; num1 = num1 / 26 - 1;}
else{
temp[cnt++] = num1 % 26;
num1 = num1 / 26;
}
}
for(int i = cnt-1; i >= 0; i--)
printf("%c", word[temp[i]]);
printf("%d\n", num2);
}
void slove2()
{
int len = strlen(s);
int num1 = 0, num2 = 0;
int i = 0;
while(s[i] >= 'A' && s[i] <= 'Z')
{
num1 = num1 * 26 + s[i] - 'A'+1;
i++;
}
for(;i< len; i++)
{
num2 = num2 * 10 + s[i] - '0';
}
printf("R%dC%d\n", num2, num1);
}
int main ()
{
word[1] = 'A';
for(int i = 2; i <= 26; i++)
word[i] = word[i-1]+1;
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", s);
int len = strlen(s);
int flag = 0;
for(int i = 0; i < len; i++)
{
if(s[i] >= '0' && s[i] <= '9' && s[i+1]>='A' && s[i+1] <= 'Z')
flag = 1;
}
if(flag == 1){
slove1();
}
else{
slove2();
}
}
return 0;
}