原题链接:
http://codeforces.com/problemset/problem/1/B
题意:
一道进制转化的模拟题:A==1;
...
Z==26;
AA==27;
AB==28;
按照这个方式计算互相转换(数字到字母,字母到数字),从A到Z很容易就联想到是:
(1) [数字]=[字母]-'A'+1;
(2)[字母]=[数字]-1+'A';
但要注意没有字母代表0;当执行(2)时,数字为0时字母就变成了'@';
如26-->A@,实际应为z;那么该如何解决呢?
我们将每位是对应的值用我们所熟知的十进制表示一下[A] [@]-->[1] [-1];
再负变正[1] [-1]-->[0] [26];
也就是说我们在讲数字转化成字母后需要进行处理;
1 if(!(a[i]>='A'&&a[i]<='Z')&&!(a[i]>='0'&&a[i]<='9')) 2 { 3 a[i]=a[i]-'A'+'Z'+1; 4 a[i+1]--; 5 }
代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<string> 4 #include<algorithm> 5 6 using namespace std; 7 8 bool vj(string a) 9 { 10 int i,fg=0; 11 bool x=true; 12 for(i=0;i<a.length();i++) 13 { 14 if(a[i]>='1'&&a[i]<='9') 15 fg=1; 16 if(fg&&a[i]>='A'&&a[i]<='Z') 17 return !x; 18 } 19 return x; 20 } 21 22 int main() 23 { 24 string s; 25 int n; 26 cin>>n; 27 while(n--) 28 { 29 cin>>s; 30 if(vj(s)) 31 { 32 int sumC=0,sumR=0; 33 int i; 34 for(i=0;i<s.length();i++) 35 { 36 if(s[i]>='A'&&s[i]<='Z') 37 sumC=sumC*26+(s[i]-'A'+1); 38 else 39 sumR=sumR*10+(s[i]-'0'); 40 } 41 cout<<'R'<<sumR<<'C'<<sumC<<endl; 42 } 43 else 44 { 45 string a; 46 int sumR=0,sumC=0; 47 int i,fg=1; 48 for(i=0;i<s.length();i++) 49 { 50 if(s[i]>='0'&&s[i]<='9'&&fg) 51 sumR=sumR*10+(s[i]-'0'); 52 else if(s[i]>='0'&&s[i]<='9') 53 sumC=sumC*10+(s[i]-'0'); 54 if(s[i]=='C') 55 fg=0; 56 } 57 while(sumC) 58 { 59 a+=sumC%26-1+'A'; 60 sumC/=26; 61 } 62 for(i=0;i<a.length()-1;i++) 63 { 64 if(!(a[i]>='A'&&a[i]<='Z')&&!(a[i]>='0'&&a[i]<='9')) 65 { 66 a[i]=a[i]-'A'+'Z'+1; 67 a[i+1]--; 68 } 69 } 70 reverse(a.begin(), a.end()); 71 if(a[0]=='@') 72 a=a.substr(1); 73 cout<<a<<sumR<<endl; 74 } 75 } 76 return 0; 77 }
------------欢迎评论--------------