您好,登錄后才能下訂單哦!
小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)
運行結果:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。