CF1B-Spreadsheet题解
题意:在表格中格子有两种表示方式,一种为列从
A-Z,AA-ZZ,AAA-ZZZ...
,行为1,2,3...
,如B2
、BC23
等。另一种为R+行+C+列
的形式,如R23C45
等。你需要进行回答若干次询问,每次给出一个坐标,将其转换为另一种形式。
首先需要判断输入的是哪种形式,两种较为简洁的做法如下:
- 可以使用 sscanf 或 stringstream 来从字符串进行读入,判断是否能读入到 char+int+char+int 类型。
- 可以将字母和数字分段存入 vector,判断有几段。
处理主要涉及 10 进制和 26 进制的互相转换,这一步基本没有太大区别,可以循环也可以递归。
做法一 By ZhouYuChen
#include<cstdio>
void g(int t){if(t){g((t-1)/26);putchar(65+(t-1)%26);}}
int main(){
int n,x,y;
char s[64],*p;
for(scanf("%d ",&n);n--;){
gets(s);
if(sscanf(s,"%*c%d%*c%d",&x,&y)==2){
g(y);
printf("%d\n",x);
}else{
for(x=0,p=s;*p>64;++p)
x=x*26+*p-64;
printf("R%sC%d\n",p,x);
}
}
return 0;
}
做法二 By RAD
char buf[110000];
inline int from(string &s) {
int res = 0;
forn(i, s.size())
res = res * 26 + s[i] - 'A' + 1;
return res;
}
inline void toRC(vector<string> &v) {
printf("R%dC%d\n", atoi(v[1].c_str()), from(v[0]));
}
void to(int x) {
int st = 1, len, sum = 0;
forn(i, 20) {
st *= 26;
sum += st;
if (x <= sum) {
len = i + 1;
break;
}
}
x -= sum - st + 1;
string res(len, 'A');
forn(i, len) {
res[len - i - 1] += x % 26;
x /= 26;
}
printf("%s", res.c_str());
}
inline void fromRC(vector<string> &v) {
to(atoi(v[3].c_str()));
printf("%s\n", v[1].c_str());
}
int main() {
int tt;
scanf("%d", &tt);
forn(ii, tt) {
scanf("%s", buf);
string s = buf;
vector<string> v;
forn(i, s.size()) {
int j = i;
string cur;
while (j < (int)s.size() && isalpha(s[j]) == isalpha(s[i])) {
cur += s[j];
j++;
}
i = j - 1;
v.pb(cur);
}
if ((int)v.size() == 2)
toRC(v);
else
fromRC(v);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步