codeforces 1B Spreadsheets 解题报告
题目大意:
用26个大写字母A~Z代表1~26,例如A是1,B是2,Z是26,AA是27;
由于没有代表0的字母,因此就有例如AAAA!=0.5*BAAA;因为AAAA=26^3+26^2+26+1,而BAAA=2*26^3+26^2+26+1;
因此先求出n的位数m,然后构造出AA..A(m个A),然后在每个位置上取最大值。
代码:
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n; char s[20]; char ans[20]; int sum[20],f[20]; void convert(int col); int main() { cin>>n; sum[0]=f[0]=1; for(int i=1;i<20;i++) { f[i]=26*f[i-1]; sum[i]=sum[i-1]+f[i]; if(sum[i]>1000000) break; } while(n--) { memset(s,'\0',sizeof(s)); scanf("%s",s); int len=strlen(s); if(s[0]=='R') { int i=1; while(s[i]>='0' && s[i]<='9' && i<len) i++; if(i<len && s[i]=='C' && s[i-1]>='0' && s[i-1]<='9' && s[i+1]>='0' && s[i+1]<='9')// { int c=i+1; int col=0; int tmp=1; while(c<len) { col=col*10+s[c]-'0'; c++; } convert(col); printf("%s",ans); for(int k=1;k<i;k++) cout<<s[k]; } else { int in=0; int col=0,tmp=1; while(s[in]<'0' || s[in]>'9') { col=col*26+s[in]-'A'+1; in++; } cout<<"R"; while(in<len) { cout<<s[in]; in++; } cout<<"C"; cout<<col; } } else { int in=0; int col=0,tmp=1; while((s[in]<'0' || s[in]>'9') && in<len) { col=col*26+s[in]-'A'+1; in++; } cout<<"R"; while(in<len) { cout<<s[in]; in++; } cout<<"C"; cout<<col; } cout<<endl; } return 0; } void convert(int col) { memset(ans,'\0',sizeof(ans)); int i=1,slen=1,cnt=0; while(col>sum[i]) {slen++; i++; } col=col-sum[i-1]; while(slen--) { ans[cnt++]=col/f[slen]+'A'; col%=f[slen]; } }