编程实现excle的行列命名与另一种表示方式的相互转换

小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的,规则类似。

创新互联主要从事成都网站制作、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务个旧,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

表格单元所在的行则是按数值从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 
#include 
#include 
#include 

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=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='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)

运行结果:

编程实现excle的行列命名与另一种表示方式的相互转换


分享题目:编程实现excle的行列命名与另一种表示方式的相互转换
转载源于:http://azwzsj.com/article/jggihi.html