这道题AC的不容易啊,唉,小错误频出,查看测试数据好多才改过来的。
首先注意的是两种类型属于哪一种的判断,利用第一个字符R和第二个字符是数字,还有后面存在字符C,这三个条件来判断。
然后注意的就是把就散出来的列号c值转化成AA等字母类型的时候,我找到一个规律,可以利用取余和除法来进行,
比如704代表AAB,以下为转换过程:
704%26=2-->B;
704/26=27;
27%26=1->A;
27/26=1;
1%26=1->A;
1/26=0;
此时c=0,结束循环
然后利用栈,倒着来输出。
注意到如果涉及到Z,就有点不同了。
如果余0,代表Z,然后令c--才是正确结果,
比如702代表ZZ,转换过程如下:
702%26=0-->Z;
704/26=27;
27--;
26%26=0->Z;
26/26=1;
1--;
此时c=0,结束循环
#include <iostream>
#include <string>
#include <cstring>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
bool kind_RxCx(char*ch,int len){
if(ch[0]=='R'&&ch[1]>='0'&&ch[1]<='9')
for(int i=0;i<len;i++)
if(ch[i]=='C') return 1;
return 0;
}
int main()
{
int n;
cin>>n;
getchar();
char ch[20];
while(n--){
gets(ch);
int len=strlen(ch);
int r=0,c=0;
if(kind_RxCx(ch,len)){
//from R23C55 to BC23
char row[10],col[10];
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
int row_num=0,col_num=0;
int i;
//把row的值复制到row数组
for(i=1;i<len;i++){
if(ch[i]>='0'&&ch[i]<='9'){
row[row_num]=ch[i];
row_num++;
}
else break;
}
//把col的值复制到col数组
for(;i<len;i++){
if(ch[i]>='0'&&ch[i]<='9'){
col[col_num]=ch[i];
col_num++;
}
}
r=atoi(row);
c=atoi(col);
//把c的字母表示计算出来
stack<char> sc;
while(c){
char temp=c%26+'A'-1;
if(temp=='A'-1)//即 c%26=0
temp='Z';
sc.push(temp);
c/=26;
if(temp=='Z') c--;
}
while(!sc.empty()){
cout<<sc.top();
sc.pop();
}
cout<<r<<endl;
}
else{
//from BC23 to R23C55
char row[10];
memset(row,0,sizeof(row));
int row_num=0;
int j;
//把row的值复制到row数组
for(j=0;j<len;j++){
if(ch[j]>='0'&&ch[j]<='9'){
row[row_num]=ch[j];
row_num++;
}
}
//把col的值计算出来
int flag=0;//位数
for(j=len-1;j>=0;j--){
if(ch[j]>='A'&&ch[j]<='Z'){
int add=ch[j]-'A'+1;
for(int k=0;k<flag;k++)
add*=26;
flag++;
c+=add;
}
}
r=atoi(row);
cout<<"R"<<r<<"C"<<c<<endl;
}
}
return 0;
}