小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的,规则类似。
表格单元所在的行则是按数值从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
分析:因为所有行列坐标值均不超过10^6 XXXXX999999 最多12个字符(5+6+1)可以存下
代码实现:
test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
char * my_itoa(int value,char *str)//模拟实现itoa(整数转换成字符串)
{
int i=0;
while(value!=0){
str[i++]=value%10+'0';
value/=10;
}
int start=0;
int end=i-1;
while(start<end){
char tmp=str[start];
str[start]=str[end];
str[end]=tmp;
start++;
end--;
}
return str;
}
int my_atoi(const char *str)//模拟实现atoi(字符串转换成数字)
{
assert(str);
int ret=0;
while(*str!='\0'){
ret*=10;
ret+=*str-'0';
str++;
}
return ret;
}
int my_pow(int x,int y)//返回x的y次方
{
int ret=1;
while(--y>=0){
ret*=x;
}
return ret;
}
char *coord(char *a,char *b,int len)
{
assert(a);
int flag=0;
if(a[0]=='R'&&a[1]>='0'&&a[1]<='9'){//maybe FrLc(R23C55形式) maybe FcLr(BC23形式)
int i=2;
while(a[i]!=0){
if(a[i]=='C'){
flag=1;
break;
}
i++;
}
}
if(flag==1){//must be FrLc
int i=1;
int k=0;
char row[5]={0};
while(a[i]!='C'){
row[k++]=a[i++];
}
while(a[i]<='0'||a[i]>='9'){
i++;
}
k=0;
char tmp[5]={0};
while(a[i]!=0){
tmp[k++]=a[i++];
}
int col=atoi(tmp);
int j=0;
int ret[5]={0};
while(col>0){
ret[j++]=col%26;
col/=26;
}
int start=0;
int end=0;
while(ret[end]!=0){
end++;
}
end-=1;
while(start<end){
char val=ret[start];
ret[start]=ret[end];
ret[end]=val;
start++;
end--;
}
int t =0;
memset(b,'\0',sizeof(char)*12);
while(ret[t]!=0){
b[t]='A'+ret[t]-1;
t++;
}
strcat(b,row);
}
else{//must is FcLr
int i=0;
while(a[i]>='A'&&a[i]<='Z'){
i++;
}
int j=i;
int col=0;
while(--j>=0){
col+=my_pow(26,i-j-1)*(a[j]-'A'+1);
}
char str[12]={0};
my_itoa(col,str);
memset(b,'\0',sizeof(char)*12);
b[0]='R';
int k=1;
while(0!=(b[k++]=a[i++]))
;
k-=1;
b[k++]='C';
strcat(b,str);
}
return b;
}
int main()
{
char a[12]={0};
char b[12]={0};
while(scanf("%s",a)!=EOF){
coord(a,b,12);
int i=0;
while(b[i]!=0){
printf("%c",b[i]);
i++;
}
printf("\n");
}
return 0;
}
Makefile:
bin=test
src=test.c
cc=g++
$(bin):$(src)
cc -o $@ $^ -g
.PHONY:clean
clean:
rm -f $(bin)
运行结果:
转载于:https://blog.51cto.com/lingdandan/1768964