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];
    }
}

 

posted on 2013-10-15 12:30  uestc小田  阅读(289)  评论(0编辑  收藏  举报

导航