B. Spreadsheets题解

 题目链接:http://codeforces.com/problemset/problem/1/B

①题意描述

②代码实现

③注意点和思路

①题意描述:有两种表格位置的描述方式,第一种是RXCY的形式,其中X和Y是正整数,分别代表行标和列标;第二种用字母加数字的形式,字母代表列表数字行标(和excle规则一样)。

第一行输入一个数n,代表n组询问。然后接下来n行每行输入以上两种形式的其中一种。

输出n行,每行对应输入询问的另一种表示方式。

输入:

2
R23C55
BC23

输出: 

BC23
R23C55

②代码如下: 

#include <cstdio>
#include <string.h>
char  sp[1001];
char ans[1001]; 
void Tonumber(int length)
{
	int i = 0;long long a = 0,b = 0;int temp = 1;
		while(sp[i]>='A'&&sp[i]<='Z')
	{
		a*=26;
		a+=(sp[i]-'A'+1);
		i++;
	}
	while(i<length)
	{
		b*=10;b+=(sp[i]-'0');
		i++;
	}
	printf("R");	
	printf("%lld",b);
	printf("C");
	printf("%lld\n",a);
//	memset(ans,0,sizeof(ans));
}
void Toexcle(int length)
{
	int i = 1;int a = 0,b = 0;
	while(sp[i]!='C')
	{
		if(i==length)
		{Tonumber(length);return ;//R开头没C的判断 
		}
		a*=10;a+=(sp[i]-'0');
		i++;
		
	}
	while(1)
	{
	i++;
	if(i>=length)	break;
	b*=10;b+=(sp[i]-'0');
	} 
	//数字提取
	int j = 0;int k1,k2;
	while(1)
	{
		k1 = b % 26;
		if(k1)
		ans[j]=(b%26)+'A'-1;
		else ans[j] = 'Z';
		b/=26;
		if(ans[j]=='Z')b--;
		if(!b)break;j++;
	} 
	//进制转换 
	k2 = strlen(ans);
	while(k2--)printf("%c",ans[k2]); 
	printf("%d\n",a);
	//答案输出 
	memset(ans,0,strlen(ans));
}
int main()
{
	int n,m;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%s",&sp);
		m = strlen(sp);
		if(sp[0]=='R'&&sp[1]<'A')Toexcle(m);//R开头第一步判断 
        else Tonumber(m);
        memset(sp,0,m);
	}
 return 0;	
} 

③注意点以及思路

十进制转excle一直对26取模,取出的数依次存到数组中,如果这个模数等于26(Z)那么对商进行-1操作。

excle转十进制就简单了很多从最高位取数把字母次序取出加到计数器sum上,未取完则sum乘26然后重复前面操作,直到所有数全部取完。

!!!!!!!注意两种类型的判定!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值