蓝桥杯:地址转换

来源:互联网 发布:mac 文件夹隐藏与显示 编辑:程序博客网 时间:2024/06/03 05:40

题目:

    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;}


1 0