题目来源:码蹄集
https://matiji.net/exam/brushquestion/37/3181/1DC60EA6DF83A333301CFFE1407FBA59
超时限制:1000ms
内存限制:65535kb
题目描述:你用过Excel嘛?
你用过Excel嘛? 在excel中,第一列被标为 A,第二列为 B,以此类推,第26列为 Z。接下 来为由两个字母构成的列号: 第27列为AA,第28列为 AB…在标为ZZ的列 之后则由三个字母构成列号,如此类推。
行号为从1开始的整数。
单元格的坐标由列号和行号连接而成。比如,BC23表示位于第55列23行 的单元格。
有时也会采用被称为RXCY的坐标系统,其中X与Y为整数,坐标(X,Y)直接 描述了对应单元格的位置。比如,R23C55即为前面所述的单元格。
您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下 面的形式。
输入格式:第一行一个整数T( )表示将有T次询问。
接下来T行,每行一个坐标。
输出T行,每行一个被转换的坐标。
输出格式:n 行,每行一个被转换的坐标。
样例输入:
3
R12C3
AE32
BB11
样例输出:
C12
R32C31
R11C54
备注:每个坐标都是正确的。保证输入输出数据均在int范围内。输入输出数据字母部分均为大写。
参考程序:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
string str;
int n,len;
void trans(bool mode)
{
char apt[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //alphabet 字母表
int col = 0,row = 0; //col为列号,row为行号;
if(mode) //mode 1: RXCY转Excel式
{
int R = str.find("R"),C = str.find("C"); //使用find()函数,找到R与C所在的位置;
for(int i = R + 1;i < C;i++) //从R的下一位开始遍历,下同;
row = row * 10 + str[i] - '0'; //字符串转十进制数字
for(int i = C + 1;i < len;i++)
col = col * 10 + str[i] - '0';
string ans;
while(col > 0)
{
int temp = col % 26; //除26取余,下同;
if(temp == 0) temp = 26,col -= 26; //当col对应字母为'Z' 时,需要进行特判;
ans += apt[temp]; //利用apt[]将数字重新转为对应字母,使用ans字符串储存答案;
col /= 26;
}
reverse(ans.begin(),ans.end());
//此时得到的ans是按从低位到高位存储的,
//我们需要将ans反转,使其按高位到低位存储,从而符合题目要求;
cout<<ans<<row<<endl;//直接输出即可;
/*(如果不对ans进行反转,则输出应改为:)
for(int i = ans.length() - 1;i >= 0;i--) cout<<ans[i];
cout<<row<<endl;
*/
}
else //mode 2: Excel式转为RXCY式;
{
for(int i = 0;i < len;i++) //遍历字符串
{
if(!isdigit(str[i]))
col = col * 26 + str[i] - 'A' + 1; //26进制字符串转十进制数字;
else row = row * 10 + str[i] - '0'; //同上;
}
printf("R%dC%d\n",row,col);
}
}
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
cin>>str; //使用string类型,以便下面利用一些STL的特性;
bool flag = 0,mode = 0; //本题是多组数据,需要初始化;
len = str.length();
for(int i = 0;i < len;i++) //遍历整个字符串,利用两种表示方式的不同来判断;
{
if(isdigit(str[i])) flag = 1; //flag用来标记数字是否已经出现;
if(flag&&str[i] == 'C') //在RXCY表示法中一定会出现字母C,且C之前一定会有数字出现,
{ //而在另一种表示法中,数字的后面不可能存在字母;
mode = 1;
break; //一旦判断出相应的表示方式,直接跳出即可;
}
}
trans(mode);// mode = 1 或 0,区分两种不同的转换;
}
return 0;
}