题目:
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;
}