Problem I: 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行數據,每行是轉換後的常規地址表示法。
Sample Input
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;)!