1B踩坑大王
题目链接
题目大意:
人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:
第一列被标为 A,第二列为 B,以此类推,第 2626 列为 Z。接下来为由两个字母构成的列号: 第 2727 列为 AA,第 2828 列为 AB ⋯\cdots 在标为 ZZ 的列之后则由三个字母构成列号,如此类推。
行号为从 1 开始的整数。
单元格的坐标由列号和行号连接而成。比如,BC23 表示位于第 55 列 23 行的单元格。
有时也会采用被称为 RXCY 的坐标系统,其中 X 与 Y 为整数,坐标 ,Y) 直接描述了对应单元格的位置。比如,R23C55 即为前面所述的单元格。
您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式。
解题思路:
- 首先判断是哪一种表示方法,我用的类似于枚举样式:
bool check() { int n; n = strlen(s); if(s[0] == 'R') { int j = 1; while(check_count(s[j]) && j < n) j ++ ; if(j == 1) return false; if(s[j] == 'C') return true; } return false; }
- 写转换函数change1/change2:
void change1() { string a1 = "", a2 = ""; int n = strlen(s); int i = 1; for ( ; i < n; i ++ ) { if (!check_count(s[i])) break; a1 += s[i]; } int res = 0; i ++; for( ; i < n; i ++ ) { res = res * 10 + s[i] - '0'; } while (res) { char p; int t = res % 26; if(!t) p = 'Z'; else p = t - 1 + 'A'; a2 = p + a2 ; if(!t) res = res / 26 - 1; else res = res / 26; } cout << a2 << a1 << '\n'; } void change2() { int n; n = strlen(s); int i = 0; string s1 = "R", s2 = "C"; for( ; i < n; i ++ ) { if(check_count(s[i])) break; } for( ; i < n; i ++ ) { s1 += s[i]; } string t = ""; for(int i = 0; i < n; i ++ ) { if (check_count(s[i])) break; t += s[i]; } int res = 0; for(int i = 0; i < t.size(); i ++ ) { res = res * 26 + t[i] - 'A' + 1; } string tt = to_string(res); s2 += tt; cout << s1 << s2 << '\n'; }
本题踩的坑:
首先这个26进制非我们常见的二进制,他不可以出现0.就。出现0代表他是“Z”,还有我们不能使其是26的倍数,这里用一个特判,如果是26的倍数,我们将其减一就好了。如:
while (res)
{
char p;
int t = res % 26; //0代表他是最后一个字母
if(!t)
p = 'Z';
else
p = t - 1 + 'A';
a2 = p + a2 ;
if(!t) res = res / 26 - 1; //不能是26的整数倍,因为该进制数中不可以出现0
else res = res / 26;
}
本题AC代码:
#include <bits/stdc++.h>
using namespace std;
char s[100];
bool check_count(char a)
{
if (a >= '0' && a <= '9') return true;
return false;
}
void change1()
{
string a1 = "", a2 = "";
int n = strlen(s);
int i = 1;
for ( ; i < n; i ++ )
{
if (!check_count(s[i])) break;
a1 += s[i];
}
int res = 0;
i ++;
for( ; i < n; i ++ )
{
res = res * 10 + s[i] - '0';
}
while (res)
{
char p;
int t = res % 26; //0代表他是最后一个字母
if(!t)
p = 'Z';
else
p = t - 1 + 'A';
a2 = p + a2 ;
if(!t) res = res / 26 - 1; //不能是26的整数倍,因为该进制数中不可以出现0
else res = res / 26;
}
cout << a2 << a1 << '\n';
}
void change2()
{
int n;
n = strlen(s);
int i = 0;
string s1 = "R", s2 = "C";
for( ; i < n; i ++ )
{
if(check_count(s[i])) break;
}
for( ; i < n; i ++ )
{
s1 += s[i];
}
string t = "";
for(int i = 0; i < n; i ++ )
{
if (check_count(s[i])) break;
t += s[i];
}
int res = 0;
for(int i = 0; i < t.size(); i ++ )
{
res = res * 26 + t[i] - 'A' + 1;
}
string tt = to_string(res);
s2 += tt;
cout << s1 << s2 << '\n';
}
bool check()
{
int n;
n = strlen(s);
if(s[0] == 'R')
{
int j = 1;
while(check_count(s[j]) && j < n) j ++ ;
if(j == 1) return false;
if(s[j] == 'C') return true;
}
return false;
}
void solved()
{
cin >> s;
if(check())
{
change1();
}
else
{
change2();
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
solved();
}
return 0;
}