1B - Spreadsheet
原题链接
这题我写的时候各种bug层出不穷,这里记录一下大神的方法,太凝练了!不得不说,我的代码能力及其垃圾。
题意:给你一个字符串,要求你实现十进制和二十六进制的相互转换
思路:首先就是简单的预处理弄出输入信息,然后进行转换后输出即可,但是很容易出bug。
大佬代码
#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;
}
我的拙劣代码
string s;
bool judge(char c)
{
if(c >= 'A' && c <= 'Z') return true;
return false;
}
int main()
{
int T;
cin >> T;
while(T --)
{
cin >> s;
int col = 0, row = 0;
int k = 0, type = 1;
while(judge(s[k])) k ++;
while(k < s.size() && !judge(s[k])) k ++;
if(k < s.size() && judge(s[k])) type = 0;
if(type)
{
int d = 0;
while(judge(s[d])) col = col * 26 + (s[d] - 'A' + 1), d ++;
while(d < s.size()) row = row * 10 + s[d] - '0', d ++;
printf("R%dC%d\n", row, col);
}
else
{
int d = 1;
while(!judge(s[d])) row = row * 10 + s[d] - '0', d ++;
d ++;
while(d < s.size()) col = col * 10 + s[d] - '0', d ++;
v.clear();
while(col)
{
v.push_back(col % 26);
col /= 26;
}
for(int i = 0 ; i < v.size() ; i ++) if(v[i] <= 0 && i < v.size() - 1) v[i] += 26, v[i + 1] --;
for(int i = v.size() - 1 ; i >= 0 ; i --)
{
if(v[i] == 0) continue;
cout << (char)(v[i] + 'A' - 1);
}
cout << row << endl;
}
}
return 0;
}