题目描述: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;
}