D - Spreadsheets
2016-07-21 15:41
232 查看
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
本题的题意很好理解,但是细节部分比较多。
首先是分类,我用的分类方式是判断第1个是否为R,第2个是否为数字,接下来再判断后面有没有出现C,如果满足以上条件是RXCY的格式,不满足是另一种格式。
然后比较复杂的是转化的地方,主要是由数字转换成字母方面,注意和十进制有所区别,十进制从0开始,满十进一,字母是26进制,但是是从一开始,所以原有数字在模26之后,如果模的结果为26,那么对于原有数字除以26的结果要减1,因为满26没有进一。
代码如下:
在一些知名的表格处理系统中(比如: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
本题的题意很好理解,但是细节部分比较多。
首先是分类,我用的分类方式是判断第1个是否为R,第2个是否为数字,接下来再判断后面有没有出现C,如果满足以上条件是RXCY的格式,不满足是另一种格式。
然后比较复杂的是转化的地方,主要是由数字转换成字母方面,注意和十进制有所区别,十进制从0开始,满十进一,字母是26进制,但是是从一开始,所以原有数字在模26之后,如果模的结果为26,那么对于原有数字除以26的结果要减1,因为满26没有进一。
代码如下:
#include <iostream> #include <string> #include <cmath> #include <algorithm> using namespace std; int judge(string s) { int c_num = -1; if(s[1] >= '0' && s[1] <= '9' && s[0] == 'R') { for(int i = 2; i < s.length(); i++) { if(s[i] == 'C') c_num = i; } } return c_num; } int main() { int t, c_num; int r,c; int a,b; char ch; string s; string s1; cin >> t; while(t--) { r = 0; c = 0; a = 0; b = 0; s = ""; s1 = ""; cin >> s; c_num = judge(s); //cout << c_num << endl; if(c_num != -1) { int temp = 0; for(int i = c_num - 1; i > 0; i--) { //cout << s[i] << endl; r += int((s[i] - '0')) * ceil(pow(10, temp)); //cout << r << endl; temp++; } temp = 0; for(int i = s.length() - 1; i > c_num; i--) { c += int((s[i] - '0')) * ceil((pow(10, temp))); temp++; } //cout << r << " " << c << endl; while(c != 0) { a = c % 26; if(a != 0) ch = (char)(a + 'A' - 1); else ch = 'Z'; //cout << c << endl; c = c / 26; if(ch == 'Z') c--; s1 += ch; } for(int i = s1.length() - 1; i >= 0; i--) cout << s1[i]; cout << r <<endl; } else { c_num = 0; for(int i = 0; i < s.length(); i++) { if(s[i] >= '0' && s[i] <= '9') { c_num = i; break; } } //cout << c_num << endl; int temp = 0; for(int i = c_num - 1; i >= 0; i--) { c += int((s[i] - 'A' + 1)) * ceil(pow(26,temp)); //cout << (s[i] - 'A' + 1) * (int)pow(26,temp) << endl; temp++; } //cout << c << endl; temp = 0; for(int i = s.length() - 1; i >= c_num; i--) { //cout << s[i] << endl; r += int((s[i] - '0')) * ceil(pow(10,temp)); temp++; } //cout << r << endl; cout << "R" << r << "C" << c << endl; } } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002