您的位置:首页 > 其它

codeforces 1B Spreadsheets 解题报告

2013-10-15 12:30 302 查看




题目大意:
  用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];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: