您的位置:首页 > 其它

Code Forces 1B 各种技巧+进制转换升级版

2013-11-04 18:14 155 查看
给一个t,t组数据

对于每组数据可能有两种形式

_1 %s%d (一个大写字母组成的字符串str+一个数字x)

_2 R%dC%d (R+一个数字y+C+一个数字x)

如果给出第一种形式,str可以转换为一个数字y,那么全部的信息可以组成一个坐标x,y,输出这个坐标的第二种形式

如果给出第二种形式,数字x可以转换为一个字符串,然后输出xy的第一种形式

数字和字符串相互转换的规则为

A对应1,B对应2.....Z对应26,然后AA对应27,AB对应28,AZ对应52,类似进制转换,但是不是

有一点,这个规则下是每个位置是不会出现0的

换句话说Z是26,它的下一是AA,需要向高位进1,但是他的低位进完位是A,这个A表示的是1,而不是0

来对比一下其他进制...

2进制每位可以有0或者1两种情况

4进制每位可以有0,1,2,3 四种情况

8进制每位可以有0,1,2,3,4,5,6,7 八种情况

而这个进制...每位可以有A-Z 26种 但他不是26进制,26就是一个Z,他也不是27进制,27是AA,

而这个规则下一位字母可以表示最大数是26,最小数是1...

说实话这个规则我是想到,但是实现不出来...

看了下大神的思路...求的时候预留一个A的位置(x-1),然后如果进位导致了低位是0的时候 就需要补一个A,那么0对应了A,25对应Z

总体上就是对(x-1)转26进制,如果%26==25正好表示的就是Z

然后就是对输入数据的处理,

用到了一些技巧

sscanf(str,"%*[A-Z]%d",&ans);

*[A-Z]过滤掉前面的大写字母,然后读一个数,[]里可以写a-z0-9A-Z这样的

sscanf(str,"%*c%d%*c%d",&r,&x)

这个就神奇了,%*c是过滤掉一些%c格式的字符,但是神奇之处他可以识别数字,遇到数字之后就自动往%d里读了...

#include<stdio.h>
void dfs(int x){
if((x-1)/26){
dfs((x-1)/26);
}
printf("%c",(x-1)%26+'A');
}
int main(){
int x,r,t;
char str[1111],ans[111];
scanf("%d",&t);
while(t--){
scanf("%s",&str);
if(sscanf(str,"%*c%d%*c%d",&r,&x)==2){
dfs(x);
printf("%d\n",r);
}else {
int sum=0,ans;
for(int i=0;str[i]>='A'&&str[i]<='Z';i++){
sum=sum*26+(str[i]-'A')+1;
}
sscanf(str,"%*[A-Z]%d",&ans);
printf("R%dC%d\n",ans,sum);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: