您的位置:首页 > 其它

CodeForces 1B Spreadsheets(EXCEL)

2016-07-21 13:35 459 查看
Description

  在一些知名的表格处理系统中(比如:excel表格),我们经常用大写的字母来表示列,例如A表示第1列,B表示第2列,第26列用Z来表示,同时第27列我们用AA来表示,第28列我们用AB来表示,第29列我们用AC来表示,AZ表示第52列,ZZ之后我们就需要用3个字母来表示列了。
  行的表示比较简单,我们一般用正整数来表示,比如1就表示第1行,5就表示第5行,行和列一起表示成为类似BC23的情况,这个表示在第23行,第55列。
  有时候,我们的系统也会用RXCY的格式来表示,X和Y是整数,分别表示行号和列号。例如:R23C55表示的位置和之前那个例子是一样的。
  你的任务是写一个程序,将这些位置在两种不同的表示方法之间转化。

Input

第一行是一个正整数n(1<=n<=10^5), 表示测试数据的数量。
接下来n行,每行一串字符,表示一个位置,输入保证所有的位置都是正确的,没有一个位置的行号或者列号超过10^ 6。

Output

输出n行,每行是对应的位置的转化结果。

Sample Input

2
R23C55
BC23

Sample Output

BC23
R23C55

这个题目是这5个里面最难的。
首先是26进制,和正常的26进制有一点点区别,但是如果仔细体会进制的规则,还是可以写出很对称的代码的。
我的代码:

#include<stdio.h>
#include<string.h>

int main()
{
int r, c, d, e, f, g, k,l,z;
char ch[20];
int n;
scanf("%d", &n);
while (n--)
{
scanf("%s", ch);
l = strlen(ch);
z = 0;
for (int i = 0; i < l; i++)if (ch[i]>'9')z++;
if (z == 2 && ch[0] == 'R' && ch[1] <= '9')
{
k = 1;
r = 0;
while (ch[k] <= '9')
{
r *= 10;
r += ch[k] - '0';
k++;
}
k++;
c = 0;
while (k < l)
{
c *= 10;
c += ch[k] - '0';
k++;
}
d = (c - 1) / 26;
e = (d - 1) / 26;
f = (e - 1) / 26;
g = (f - 1) / 26;
if (g)printf("%c", 'A' + (g - 1) % 26);
if (f)printf("%c", 'A' + (f - 1) % 26);
if (e)printf("%c", 'A' + (e - 1) % 26);
if (d)printf("%c", 'A' + (d - 1) % 26);
printf("%c", 'A' + (c - 1) % 26);
printf("%d\n", r);
}
else
{
if (z == 1)c = ch[0] - 'A' + 1;
else if (z == 2)c = ch[1] - 'A' + 1 + (ch[0] - 'A' + 1) * 26;
else if (z == 3)c = ch[2] - 'A' + 1 + (ch[1] - 'A' + 1) * 26 + (ch[0] - 'A' + 1) * 26 * 26;
else if (z == 4)c = ch[3] - 'A' + 1 + (ch[2] - 'A' + 1) * 26 + (ch[1] - 'A' + 1) * 26 * 26 + (ch[0] - 'A' + 1) * 26 * 26 * 26;
else c = ch[4] - 'A' + 1 + (ch[3] - 'A' + 1) * 26 + (ch[2] - 'A' + 1) * 26 * 26 + (ch[1] - 'A' + 1) * 26 * 26 * 26 + (ch[0] - 'A' + 1) * 26 * 26 * 26 * 26;
k = z;
r = 0;
while (k < l)
{
r *= 10;
r += ch[k] - '0';
k++;
}
printf("R%dC%d\n", r, c);
}
}
return 0;
}


首先直接用if(z==2&&
ch[0]=='R'&&
ch[1]<='9')
判断到底是R23C55的格式还是BC23的格式,然后分开处理。
最开始我是写了一个函数求ch里面的字母的个数。

int zimu(char ch[])
{
int l = strlen(ch);
int sum = 0;
for (int i = 0; i < l; i++)if (ch[i]>'9')sum++;
return sum;
}

结果是Runtime error on test 10然后就感觉应该是因为这个函数申请了太多内存。

然后仔细一看,现在的程序和最开始的已经完全不一样了,最开始的思路是从左往右一步步判断,后来发现特别麻烦,还存在重复工作的现象。
现在的程序已经不需要这个函数了,就把求ch里面的字母的个数的代码直接写在main函数里面了,然后把所有变量都拿到while(n--)
这个循环外面,终于解决了这个问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: