题目描述
小、B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的阿萨德,规则类似。
十大a
表格单元所在的行则是按数值从1开始编号的,表格单元名称则是其列编号和行编号的组合,如单元格BB22代表的单元格为54列中第22行的单元格。
小B感兴趣的是,编号系统有时也可以采用RxCy的规则,其中x和y为数值,表示单元格位于第x行的有第y列。上述例子中的单元格采用这种编码体系时的名称为R22C54。
小B希望快速实现两种表示之间的转换,请你帮忙设计程序将一种方式表示的坐标转换为另一种方式。
输入 输入的第一行为一个正整数T,表示有T组测试数据(1<=T<=10^5)。 随后的T行中,每行为一组测试数据,为一种形式表示的单元格坐标。 保证所有的坐标都是正确的,且所有行列坐标值均不超过10^6。 | 样例输入 2 R23C55 BC23 |
输出 对每组测试数据,单独输出一行,为单元格坐标的另一种表示形式。 | 样例输出 BC23 R23C55 |
解决办法:通过100%
// CodeChange.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <string>
using namespace std;
void int_to_str(int num,string &ch)
{
int a=num; //取余后剩下的数
char b=0; //取余的数
string c=""; //结果
int count=1; //记录现在26进制的第几位
while (a!=0)
{
b=a%26;
char buf='0';
if(b!=0)
{
buf=b+'A'-1;
}
else
{
buf='Z';
b=26;
}
string inse="a";
inse[0]=buf;
c.insert(0,inse);
a=(a-b)/26;
}
ch.append(c);
}
void str_to_int(string ch,int &num)
{
char a='0';
num=0;
for (int i =0;i<ch.length();i++)
{
a=ch[i];
num=num*26+a-'A'+1;
}
}
int main()
{
int a; //数据的组数
cin>>a;
string *buf_c=new string[a]; //需要转换的数据
for (int i=0;i<a;i++)
{
cin>>buf_c[i];
}
string buf;
for(int i=0;i<a;i++)
{
buf=buf_c[i];
int type; //输入的数据是那种类型
int char_num=0;
for(int i=0;i<buf.length();i++)
{
if(buf[i]<='Z' && buf[i] >='A')
char_num++;
}
if(char_num==2 && buf[1]>='0' && buf[1] <='9') //偶数个字母并且第二个为数字
{
type=1;
}
else
{
type=2;
}
if(type==1) //第一种类型
{
int row=0;
int col=0;
int count=1;
char current=buf[count];
while(current>='0' && current <='9')
{
row=row*10+current-'0'; //统计row
count++;
current=buf[count];
}
count=buf.length()-1;
current=buf[count];
while(current>=48 && current <=57)
{
col =col+pow(10.0,(double)(buf.length()-count-1))*(current-'0');
count--;
current=buf[count];
}
string s="";
int_to_str(col,s);
cout<<s<<row<<endl;
}
else //第二种类型
{
int count=0; //记录前面的字母个数
while(buf[count]>='A' && buf[count]<='Z' )
{
count++;
}
count--;
string row="";
string s="";
for(int i=0;i<=count;i++)
{
s=s+buf[i];
}
for (int i=count+1;i<buf.length();i++)
{
row=row+buf[i];
}
int num=0;
str_to_int(s,num);
cout<<"R"<<row<<"C"<<num<<endl;
}
}
if (buf_c!=NULL)
{
delete []buf_c;
buf_c=NULL;
}
return 0;
}