蓝桥杯:地址转换

题目:

    Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。   
    事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。 第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。
    你的任务是:编写程序,实现从RC地址格式到常规地址格式的转换。
【输入、输出格式要求】
    用户先输入一个整数n(n<100),表示接下来有n行输入数据。
    接着输入的n行数据是RC格式的Excel单元格地址表示法。
    程序则输出n行数据,每行是转换后的常规地址表示法。

    例如:用户输入:
2
R12C4
R5C255
    则程序应该输出:
D12
IU5


分析:

1.形如:用户先输入一个整数n(n<100),表示接下来有n行输入数据。接着输入...  可以有固定格式:cin>>n;while(--n){...}

2.把行和列从字符串中分离开来。由题目可以看出:第一个字母一定是‘R’,两个数字之间的一定是‘C’,可以利用这一点进行分离。

3.字符和数字之间的相互转换。例如:int a='5'-'0'=5;   int q=3;char c='A'+q-1='C';

4.列的数字与字母之间的关系。例如:R5C255=IU5,因为255=9*26+21,而I排第9,U排第21。即 m=255/26;n=255%26;mn与5共同组成地址。


代码1:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;

int main()
{
	int i,j,n,p,q;
	char a[100],b[100];
	cin>>n;
	while(n--)
	{
		cin>>a;
		for(i=0;;i++)
			if(a[i]=='C') break;
		sscanf(a+1,"%d",&p);//p代表R后面的行号
		sscanf(a+i+1,"%d",&q);//q代表C后面的列号
		j=0;
		while(q)
		{
			if(q%26==0)//如果正好轮完26个字母,那么后一个字母就是'Z'
			{
				b[j++]='Z';
				q=q/26-1;
			}
			else
			{
				b[j++]=q%26+'A'-1;
				q=q/26;
			}
		}
		for(i=j-1;i>=0;i--)
			cout<<b[i];
		cout<<p<<endl;
	}
	return 0;
}

代码2:

注意:2个字符转换为整型的时候是先减‘0’再乘10,但是如果是多个的话,就需要先乘10再减‘0’。

#include<iostream>
#include<stdio.h>
using  namespace std;

int main()
{
	int n,i,r,c;
	string str;
	int rem,q;
	cin>>n;
	while(n--){
		r=c=0;
		cin>>str;
		for(i=1;str[i]!='C';i++){
			r*=10; 
			r+=str[i]-'0';
		}
		for(i++;str[i];i++){
			c*=10;
			c+=str[i]-'0';
		}
		rem=c%26;
		q=c/26;
		if(q){
			printf("%c%c%d\n",'A'+q-1,'A'+rem-1,r);
		} 
		else{
			printf("%c%d\n",'A'+rem-1,r);
		}
	} 
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值