编号转换(百度2016实习生真题)

题目描述

小、B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的阿萨德,规则类似。

十大a

表格单元所在的行则是按数值从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


解决办法:通过100%

// CodeChange.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <string>
using namespace std;


void int_to_str(int num,string &ch)
{
	int a=num;			//取余后剩下的数	
	char b=0;			//取余的数
	string c="";		//结果
	int count=1;		//记录现在26进制的第几位

	while (a!=0)
	{
		b=a%26;
		char buf='0';
		if(b!=0)
		{
			buf=b+'A'-1;
		}
		else
		{
			buf='Z';
			b=26;
		}

		string inse="a";
		inse[0]=buf;
		c.insert(0,inse);

		a=(a-b)/26;
	}	

	ch.append(c);
}


void str_to_int(string ch,int &num)
{
	char a='0';
	num=0;
	for (int i =0;i<ch.length();i++)
	{
		a=ch[i];
		num=num*26+a-'A'+1;
	}

}


int main()
{

	int a;										//数据的组数
	cin>>a;

	string *buf_c=new string[a];				//需要转换的数据
	for (int i=0;i<a;i++)
	{
		cin>>buf_c[i];
	}
	string buf;
	for(int i=0;i<a;i++) 
	{
		buf=buf_c[i];
		int type;								//输入的数据是那种类型
		int char_num=0;
		for(int i=0;i<buf.length();i++)
		{
			if(buf[i]<='Z' && buf[i] >='A')
				char_num++;
		}

		if(char_num==2 && buf[1]>='0' && buf[1] <='9')    //偶数个字母并且第二个为数字
		{
			type=1;
		}
		else
		{
			type=2;
		}

		if(type==1)									//第一种类型
		{
			int row=0;
			int col=0;
			int count=1;
			char current=buf[count];
			while(current>='0' && current <='9')		
			{
				row=row*10+current-'0';				//统计row
				count++;
				current=buf[count];
			}
			count=buf.length()-1;
			current=buf[count];
			while(current>=48 && current <=57)
			{
				col	=col+pow(10.0,(double)(buf.length()-count-1))*(current-'0');
				count--;
				current=buf[count];
			}
			string s="";
			int_to_str(col,s);
			cout<<s<<row<<endl;
		}

		else										//第二种类型
		{	
			int count=0;							//记录前面的字母个数
			while(buf[count]>='A' && buf[count]<='Z' )
			{
				count++;
			}
			count--;

			string row="";
			string s="";
			for(int i=0;i<=count;i++)
			{
				s=s+buf[i];
			}

			for (int i=count+1;i<buf.length();i++)
			{
				row=row+buf[i];
			}

			int num=0;
			str_to_int(s,num);
			cout<<"R"<<row<<"C"<<num<<endl;
		}
	}




	if (buf_c!=NULL)
	{
		delete []buf_c;
		buf_c=NULL;
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值