现在的位置: 首页 > 综合 > 正文

蓝桥杯校内选拔赛

2014年09月05日 ⁄ 综合 ⁄ 共 1082字 ⁄ 字号 评论关闭

题目描述:Excel
表格中,第12 4
列可表示为 R12C4,第5
255 列可表示为 R5C255,还有另一种表示方式为 D12IU5,输入
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;
}

抱歉!评论已关闭.