您的位置:首页 > 其它

字符串之Excel地址转换

2014-02-04 18:14 176 查看

ProblemI:Excel地址转换

Description

Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。



事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。

你的任务是:编写程序,实现从RC地址格式到常规地址格式的转换。

Input

用户先输入一个整数n(n<100),表示接下来有n行输入数据。

接着输入的n行数据是RC格式的Excel单元格地址表示法。

Output

程序输出n行数据,每行是转换后的常规地址表示法。

SampleInput

3

R1C1

R65535C256

R100C100


3

R100C99

R1C255

R255C27


SampleOutput

A1

IV65535

CV100


CU100

IU1

AA255




#include<iostream>

#include<stdio.h>

#include<cstring>

usingnamespacestd;

intmain()

{

intn,i,j,m,x,y,g,h,b,z;

charstr[100];

chara[100];

while(cin>>b)

{

for(z=1;z<=b;z++)

{

{

cin>>str;

n=strlen(str);

for(i=0;i<=n-1;i++)

{

if(str[i]=='C')

j=i+1;

}

x=0;

for(i=j;i<=n-1;i++)

{

m=str[i]-48;

x=10*x+m;

}

y=x%26;

g=x/26;

if(y==0)

{

y=26;

g=g-1;

}

a[0]=g+64;

a[1]=y+64;

{

h=2;

for(i=1;i<=j-2;i++)

{

a[h++]=str[i];

}

}

{

if(g<1)

{

for(i=1;i<=j-1;i++)

cout<<a[i];

cout<<endl;

}

elseif(g>=1)

{

for(i=0;i<=j-1;i++)

cout<<a[i];

cout<<endl;

}

}

}

}

cout<<endl;

}

return0;

}

将RC地址格式转换为常规地址格式,需要先了解他们之间的规律,可以看到,R后面的数字转换为代表列的字母,C后面的数字不变,直接放在R转换的代表列的字母后面,用来表示行;所以,可以对RC格式的字符串进行字符检查,记录C的下标,将C后面的数字转换为字母放在字符串的前面,将R后的数字字符直接放在字符串的后面;为了方便计算,将按照实际情况,列最高只有两个字母;

首先,将字符串全部检查一遍(for(i=0;i<=n-1;i++)),找到C的下标(if(str[i]=='C')),并将下一个字符,即数字的下标记录下来(j=i+1;);

C后面的数字代表列,应该转换为字母,借助ASCII表,先将数字字符转换为数字(for(i=j;i<=n-1;i++){m=str[i]-48;x=10*x+m;}),再将数字转换为字母字符(y=x%26;g=x/26;a[0]=g+64;a[1]=y+64;);特殊情况就是,有时数字字符转换的数字再转换成字母时会被整除,整除时(if(y==0)),第一个字母多进了一位,应该减去(g=g-1;),第二个字母为Z,直接赋值就行(y=26;);

将前面代表行的数字字符直接放在字符串后面(for(i=1;i<=j-2;i++){a[h++]=str[i];}),字符串下标从2开始(h=2;);

如果代表列的字母只有一个(if(g<1)),那么,字符串就从第二个字符开始输出(for(i=1;i<=j-1;i++)),否则(elseif(g>=1)),完全输出(for(i=0;i<=j-1;
i++));


别忘了换行(cout<<endl;)!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: