字符串之Excel地址转换

Problem I: Excel地址转换

Description

   Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”
   
   
事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”

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

Input

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

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

Output

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

Sample Input

3
R1C1
R65535C256
R100C100
 
3
R100C99
R1C255
R255C27

Sample Output

A1
IV65535
CV100
 
CU100
IU1
AA255


#include <iostream>

#include <stdio.h>

#include <cstring>

using namespace std;

int main()

{

   int n,i,j,m,x,y,g,h,b,z;

   char str[100];

   char a[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;

                    }

                    else if(g>=1)

                    {

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

                            cout<<a[i];

                        cout<<endl;

                    }

                }

           }

       }

       cout<<endl;

    }

   return 0;

}

将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;)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章