编程实现excle的行列命名与另一种表示方式的相互转换
小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(intvalue,char*str)//模拟实现itoa(整数转换成字符串){inti=0;while(value!=0){str[i++]=value%10+'0';value/=10;}intstart=0;intend=i-1;while(start<end){chartmp=str[start];str[start]=str[end];str[end]=tmp;start++;end--;}returnstr;}intmy_atoi(constchar*str)//模拟实现atoi(字符串转换成数字){assert(str);intret=0;while(*str!='\0'){ret*=10;ret+=*str-'0';str++;}returnret;}intmy_pow(intx,inty)//返回x的y次方{intret=1;while(--y>=0){ret*=x;}returnret;}char*coord(char*a,char*b,intlen){assert(a);intflag=0;if(a[0]=='R'&&a[1]>='0'&&a[1]<='9'){//maybeFrLc(R23C55形式)maybeFcLr(BC23形式)inti=2;while(a[i]!=0){if(a[i]=='C'){flag=1;break;}i++;}}if(flag==1){//mustbeFrLcinti=1;intk=0;charrow[5]={0};while(a[i]!='C'){row[k++]=a[i++];}while(a[i]<='0'||a[i]>='9'){i++;}k=0;chartmp[5]={0};while(a[i]!=0){tmp[k++]=a[i++];}intcol=atoi(tmp);intj=0;intret[5]={0};while(col>0){ret[j++]=col%26;col/=26;}intstart=0;intend=0;while(ret[end]!=0){end++;}end-=1;while(start<end){charval=ret[start];ret[start]=ret[end];ret[end]=val;start++;end--;}intt=0;memset(b,'\0',sizeof(char)*12);while(ret[t]!=0){b[t]='A'+ret[t]-1;t++;}strcat(b,row);}else{//mustisFcLrinti=0;while(a[i]>='A'&&a[i]<='Z'){i++;}intj=i;intcol=0;while(--j>=0){col+=my_pow(26,i-j-1)*(a[j]-'A'+1);}charstr[12]={0};my_itoa(col,str);memset(b,'\0',sizeof(char)*12);b[0]='R';intk=1;while(0!=(b[k++]=a[i++]));k-=1;b[k++]='C';strcat(b,str);}returnb;}intmain(){chara[12]={0};charb[12]={0};while(scanf("%s",a)!=EOF){coord(a,b,12);inti=0;while(b[i]!=0){printf("%c",b[i]);i++;}printf("\n");}return0;}
Makefile:
bin=testsrc=test.ccc=g++$(bin):$(src)cc-o$@$^-g.PHONY:cleanclean:rm-f$(bin)
运行结果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。