字符串之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;)

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