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进制有一点点区别,但是如果仔细体会进制的规则,还是可以写出很对称的代码的。
我的代码:
首先直接用if(z==2&&
ch[0]=='R'&&
ch[1]<='9')
判断到底是R23C55的格式还是BC23的格式,然后分开处理。
最开始我是写了一个函数求ch里面的字母的个数。
结果是Runtime error on test 10然后就感觉应该是因为这个函数申请了太多内存。
然后仔细一看,现在的程序和最开始的已经完全不一样了,最开始的思路是从左往右一步步判断,后来发现特别麻烦,还存在重复工作的现象。
现在的程序已经不需要这个函数了,就把求ch里面的字母的个数的代码直接写在main函数里面了,然后把所有变量都拿到while(n--)
这个循环外面,终于解决了这个问题。
在一些知名的表格处理系统中(比如: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--)
这个循环外面,终于解决了这个问题。
相关文章推荐
- servlet genericservlet httpservlet
- functional助力C++11实现高度可重用接口-线程池例子
- springmvc的ModelAttribute注解
- 2016夏季练习——二叉树
- 17.1.1.7 Setting Up Replication with New Master and Slaves 设置复制对于新的Master和Slaves:
- 2016专题训练II-黄华 网络爬虫
- 17.1.1.7 Setting Up Replication with New Master and Slaves 设置复制对于新的Master和Slaves:
- 17.1.1.7 Setting Up Replication with New Master and Slaves 设置复制对于新的Master和Slaves:
- Git入门(6)-管理修改
- 监听键盘的事件
- Google论文系列(2) MapReduce
- 经典聚类算法——K-means
- 逻辑坐标系 设备坐标系 客户坐标系 屏幕坐标系
- java接口和抽象类
- UIAlertView和UIAlertController那点事儿
- Java如何判断线程池所有任务是否执行完毕
- OpenCV学习笔记——腐蚀与膨胀
- Xamarin.Forms项目无法添加服务引用
- AngularJS的学习--$on、$emit和$broadcast的使用
- Hadoop DataNode, NameNode无法启动