赛码网的一道百度编程题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了赛码网的一道百度编程题相关的知识,希望对你有一定的参考价值。
最近偶尔接触到这个赛码网,看了百度的一道编程题,于是尝试了一下,发现虽然天天写代码实现这个居然花了我好长时间,仍然没有通过全部案例。目前给的通过率是83%
题目如下:
小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的,规则类似。
表格单元所在的行则是按数值从1开始编号的,表格单元名称则是其列编号和行编号的组合,如单元格BB22代表的单元格为54列中第22行的单元格。
小B感兴趣的是,编号系统有时也可以采用RxCy的规则,其中x和y为数值,表示单元格位于第x行的有第y列。上述例子中的单元格采用这种编码体系时的名称为R22C54。
小B希望快速实现两种表示之间的转换,请你帮忙设计程序将一种方式表示的坐标转换为另一种方式。
输入
输入的第一行为一个正整数T,表示有T组测试数据(1<=T<=10^5)。随后的T行中,每行为一组测试数据,为一种形式表示的单元格坐标。保证所有的坐标都是正确的,且所有行列坐标值均不超过10^6。
|
样例输入
2 R23C55 BC23
|
输出
对每组测试数据,单独输出一行,为单元格坐标的另一种表示形式。
|
样例输出
BC23 R23C55
|
时间限制
C/C++语言:1000MS 其他语言:3000MS |
内存限制
C/C++语言:65536KB 其他语言:589824KB |
代码如下(希望高手可以不吝赐教):
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> char Alph26[26+1]={‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘}; void init(char *instr,const int length){ memset(instr,‘\0‘,length); } void deal(char *instr); void transAlph2Num(const char *instr,int outNum); void transNum2Alph( int inNum,char *outAlph); int isRCMode(const char *instr); int findChr(const char *instr,const char c); int squareBase26(const unsigned int square ) { if( 0 == square ) return 1; else return 26*squareBase26(square-1); } char changeNumTo26Num(int inNum) { return Alph26[inNum-1]; } int changeCharTo26Num(char inNum) { for(int i = 0 ; i < 26 ; i ++) { if( inNum == Alph26[i] ) return i+1; } return 0; } int main() { int size = 0; //printf("%s","pls input the Num:"); scanf("%d",&size); char instr[10+1]; init(instr,11); while( size > 0) { init(instr,11); //printf("%s","pls input the cha:"); scanf("%s",instr); deal(instr); size-- ; } return 0; } void deal(char* instr) { int rNum = 0; int cNum = 0; char crNum[10+1]; char ccNum[5+1]; init(crNum,11); init(ccNum,6); //printf("111111\n"); //printf("isRCMode==[%d]\n",isRCMode(instr)); if( isRCMode(instr) > 0 ) { //printf("22222\n"); strncpy(crNum,instr+1,findChr(instr,‘C‘) - 1); strncpy(ccNum,instr+findChr(instr,‘C‘)+1,strlen(instr) - findChr(instr,‘C‘) - 1 ); cNum = atoi( ccNum ); //cNum = atoi( ccNum ); //printf("crNum==[%s]ccNum==[%s]\n",crNum,ccNum); char outcrNum[5+1]; init(outcrNum,6); transNum2Alph( atoi(ccNum),outcrNum ); //printf("crNum==[%s]ccNum==[%s]\n",crNum,ccNum); printf("%s\n",strcat(outcrNum,crNum) ); }else { //printf("sssss\n"); int i = 0; for( ; !isdigit( instr[i] ) ; i++ ); strncpy(ccNum,instr,i); strncpy(crNum,instr+i,strlen(instr) - i); int sum = 0; for(int j = 0 ; j < strlen(ccNum) ; j++ ) { sum += changeCharTo26Num( ccNum[j] )*squareBase26( strlen(ccNum) - j - 1 ); } printf("R%sC%d\n",crNum,sum); } } int findChr(const char *instr,const char c) { for( int i = 0 ; i < strlen(instr) ; i++) { if( instr[i] == c ) return i; } return -1; } int isRCMode(const char *instr ) { if(strlen(instr) < 4) { return -1; } if( -1 == findChr(instr,‘R‘) || -1 == findChr(instr,‘C‘) ) return -1; if( findChr(instr,‘R‘) < ( findChr(instr,‘C‘) - 1 ) ) { char tmp[5+1]; init(tmp,6); strncpy( tmp, instr + findChr(instr,‘R‘) + 1, findChr(instr,‘C‘) - 1 - findChr(instr,‘R‘)); if(isdigit(tmp[0])) return 1; else return -1; } return -1; } void transNum2Alph( int inNum,char *outAlph) { int value = 0; int left = 0; int Num = inNum; char tmp[5+1]; init(tmp,6); //printf("Num==[%d]\n",Num); while( Num / 26 != 0 ) { value = Num / 26; left = Num % 26; Num = value; //printf("inNum==[%d]\n",value); outAlph[0] = changeNumTo26Num( left ); outAlph[1] = ‘\0‘; //printf("outAlph==[%s]\n",outAlph); strcat(outAlph,tmp); strcat(tmp,outAlph); } //printf("outAlph==[%s]\n",outAlph); //printf("value==[%d]\n",value); //printf("outAlph==[%s]\n",outAlph); init(tmp,6); sprintf( tmp,"%c", changeNumTo26Num( Num )); //printf("tmp==[%s]\n",tmp); strcat(tmp ,outAlph); init(outAlph,strlen(outAlph)); strcpy(outAlph,tmp); }
以上是关于赛码网的一道百度编程题的主要内容,如果未能解决你的问题,请参考以下文章