题目描述:Excel
表格中,第12 行 4
列可表示为 R12C4,第5
行 255 列可表示为 R5C255,还有另一种表示方式为 D12,IU5,输入
RC 格式转化为另一个种格式。
例:
INPUT:
2
R12C4
R5C255
OUTPUT:
D12
IU5
编程实现两种表示方法间的转化(第二行输入的2表示有两条RC格式需要转换)。
题目分析:字母表示的列中,当最长字母为n时,可以表示的总的列数为26^1+26^2+......+26^n,所以当给我们一个列数时,我们应该首先判断是用几个字母表示的。这是我们就要减掉1~n-1个字母表示的总数(其实就是26^1+26^2+......+26^n-1),然后这个数就可以看做一个26进制的数了!
求解注意:我们可以用1-26为余数进行分离,但是注意,每一次取完余数之后除26的到的应该是下一个字母的表示,比如R5C255,去掉前面的26个之后剩下229,229/266=8,但是我们表示的时候用的是第九个字母I,所以我们输出的时候应该加1.
#include<stdio.h> #include<string.h> //int num[6]={26,676,17576,456976,11881376,308915776}; int sum[6]={26,702,18278,475254,12356630,321272406}; char s[27]={'A','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; int ans[10]; int main() { int i,n,r,c,k; scanf("%d%*c",&n); printf("%d\n",n); while(n--) { scanf("%*c%d%*c%d%*c",&r,&c); printf("%d %d\n",r,c); for(i=0;i<6;i++) if(c<=sum[i]) { k=i; break; } if(k>=1) c=c-sum[k-1]; i=0; memset(ans,0,sizeof(ans)); while(c>0) { if(c%26==0) ans[i++]=26; else ans[i++]=c%26; c=c/26; if(c==1) break; } for(i=k;i>=0;i--) { if(i!=0&&ans[i]<26) ans[i]++; printf("%c",s[ans[i]]); } printf("%d\n",r); } return 0; }