链接:
https://codeforces.com/problemset/problem/1/B
题意:
两种方式表达表格:
一种是R X C Y ,例如R 23 C 55是第55列第23行中单元格
另一种是用字母+数字表示
数字部分表示行
字母部分 A表示1,Z表示26,AA表示27,AZ表示52,以此类推
例如BC23 表示第55列第23行中单元格
给你其中一种,转化成另一种
输入
2
R23C55
BC23
输出量
BC23
R23C55
解:
10s的超长时间
只需要想好怎么处理就行
首先判断是哪一种形式,我这边区分的依据是RXCY模式数字后面有字母,另一种数字后面没有字母
然后转换,观察两种方式,行不需要转换,列需要转换
首先是数字转字母部分:
A代表1,26代表Z,第一时间想到26进制,但是26进制下,26为A0(10),但是27进制也不合适
这是因为有0的存在,而题目所给1-A,26-Z,27-AA,分别是(1),(26),(1)(1),但是A=A+0,Z=A+25;
所以处理十进制转26进制时每次都先减1再取余**(这只是计算部分!!)**
实际上A还是占用了1,所以后面每一位都要先减一再除
例如27-AA,为了给第一位补上A,所以求第二位时先减一,以此类推
(会发现这个减一在刚好被26整除生效,比如26出现Z-26,而不是A_)
字母转数字:反过来就很好想了,补上1就行
实际代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long int ll;
int main()
{
int n;
cin>>n;
for(int f=1;f<=n;f++)
{
ll x=0,y=0;//列 行
int mod=2;//模式1 RXCY 模式2 列+行
string s;
cin>>s;
int lg=s.length();
for(int i=0;i<lg-1;i++)
{
if(s[i]<='9'&&s[i]>='0')
{
if(s[i+1]>='A'&&s[i+1]<='Z')
{
mod=1;
}
}
}
if(mod==1)
{
bool sr=0;
for(int i=0;i<lg;i++)
{
if(s[i]=='R') sr=1;
else if(s[i]=='C') sr=0;
else
{
if(sr==1) y=y*10+(s[i]-'0');//R 行
else if(sr==0) x=x*10+(s[i]-'0');//C 列
}
}
//cout<<y<<" "<<x<<endl; test输出行 列
string lie;
for(;x!=0;)
{
int mao=(x-1)%26;
lie.push_back('A'+mao);
x=(x-1)/26;
}
reverse(lie.begin(),lie.end());
cout<<lie<<y<<endl;
}
else
{
string lie;
for(int i=0;i<lg;i++)
{
if(s[i]<='9'&&s[i]>='0') y=y*10+(s[i]-'0');//R 行
else lie+=s[i];
}
int llg=lie.length();
int cs=1;
for(int i=llg-1;i>=0;i--)
{
int mao=lie[i]-'A'+1;
x+=mao*cs;
cs*=26;
}
cout<<"R"<<y<<"C"<<x<<endl;
}
}
}
限制:
time limit per test
10 seconds
memory limit per test
64 megabytes
input
standard input
output
standard output